xiejirui666 发表于 2023-7-31 17:09:05

小问题:定时器在退出界面后还会重复发送,所以要在.onDisAppear()内加入终止定时器,达到进入界面可以同步获取温湿度,离开界面停止。
      
      .onDisAppear(()=>{

                clearInterval(this.timer2);

                clearInterval(this.timer);
            })

xiejirui666 发表于 2023-7-31 17:10:53

bug:在dev中的定时器和if,while语句使用总有问题,而且基本无法成功。暂不影响自己的需求。

xiejirui666 发表于 2023-8-1 17:53:38

今日问题:加入烟感模块,设计ui并编写hi3861代码:
hi3861代码如下:
// 烟雾传感器 语句与执行
                        if (strcmp(recvbuf, "yanwuon") == 0)
                        {
                                floatppm;
                                Init_E53_SF1();
                                ppm = Get_MQ2_PPM();
                                char data1 ;
                                sprintf(data1,"%.3f",ppm);
                                ret = send(new_fd, data1, strlen(data1), 0);
                                bzero(recvbuf, sizeof(recvbuf));
                        };
// 警报器 语句与执行
                        if (strcmp(recvbuf, "baojing on") == 0)
                        {
                                Beep_StatusSet(ON1);
                                sleep(2);
                                Beep_StatusSet(OFF1);
                                bzero(recvbuf, sizeof(recvbuf));
                        };

xiejirui666 发表于 2023-8-1 17:57:05

ui界面代码目的:烟雾传感器的实时上报,检测烟雾浓度,可以自己设定报警阈值,当烟雾浓度超过阈值,蜂鸣器警报。现基本实现,但有bug,在报警之后,烟雾传感器会有一定几率不上报值,暂未测出什么原因,ui代码如下:
import socket from '@ohos.net.socket';
import router from '@ohos.router'

@Component
struct PageTitle {
build() {
    Row() {
      Image($r('app.media.back'))
      .width(20)
      .height(20)
      .onClick(() => {
          router.back()
      })
      Text("烟雾传感器")
      .fontSize(22)
      .margin({ left: 20 })
    }
    .padding(12)
    .width('100%')
}
}

@Entry
@Component
struct taideng {
@State imageBgColorA: number = 0
@State ledon: boolean = false
@State recv: string = '0'
@State time: boolean = false
@State time1: boolean = false
@State jingbao: boolean =false
@State timer: number = 0
@State timer2: number = 0
@State timer3: number = 0
@State yanwu: number = 0
@State yuzhi: number = 25
@StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm'
//   tcp = socket.constructTCPSocketInstance();


build() {
    Scroll() {
      Column() {
      PageTitle()
      Stack({ alignContent: Alignment.BottomStart }) {
          Image(this.ledon ? $r("app.media.icon_fraction_smoke_online") : $r("app.media.icon_fraction_smoke_offline"))
            .backgroundColor(`rgba(255, 255, 255, ${this.imageBgColorA})`)
            .objectFit(ImageFit.Contain)
      }
      .height(this.currentBreakpoint == 'lg' ? 166 : 280)

      List() {

          ListItem() {
            Column() {
            Button({ type: ButtonType.Normal, stateEffect: false }) {
                Row() {
                  Text(this.ledon ? "已打开" : "已关闭")
                  .fontSize(25)
                  .margin({ left: 15, right: 15 })
                  .fontWeight(FontWeight.Bold)
                  .align(Alignment.Center)
                  .width('50%')

                  Image(this.ledon ? $r("app.media.icon_switch_on") : $r("app.media.icon_switch_off"))
                  .objectFit(ImageFit.Contain)
                  .align(Alignment.Center)
                  .width('50%')
                  .onClick(() => {
                      if (!this.ledon) {
                        clearInterval(this.timer2)
                      this.timer2 = setInterval(() => {
                        globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
                        //   电脑ip
                        //   tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                        console.log('connect success');
                        globalThis.tcp.send({
                            data: 'yanwuon'
                            //此处省略encoding, 默认为utf-8编码格式
                        }, err => {
                            if (err) {
                              console.log('send fail' + JSON.stringify(err));
                              return;
                            }
                            console.log('sendyanwuon success');
                        })
                        })
                        globalThis.tcp.on('message', value => {
                        console.log("on message")
                        let buffer = value.message
                        let dataView = new DataView(buffer)
                        let str = ""
                        for (let i = 0; i < dataView.byteLength; ++i) {
                            str += String.fromCharCode(dataView.getUint8(i))
                        }
                        console.log("on connect received:" + str)
                        this.yanwu = Number(str)
                        });
                      }, 1500)
                      }
                      else {
//                        clearInterval(this.timer2);
                      }
                  })
                }
            }
            .borderRadius(8)
            .backgroundColor('#ffeee1e1')
            .width('95%')
            .height('12%')
            .margin({ left: 15, right: 15 })

            Divider().color(Color.White).strokeWidth(5)

            Row(){
                Text("烟雾浓度:")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')

                Text(this.yanwu.toString()+"ppm")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')
                  .onAreaChange(()=>{
                  if(this.yanwu >= this.yuzhi){
                      this.jingbao= true;

                      //

                      globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
                        //   电脑ip
                        //   tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                        console.log('connect success');
                        globalThis.tcp.send({
                        data: 'baojing on'
                        //此处省略encoding, 默认为utf-8编码格式
                        }, err => {
                        if (err) {
                            console.log('send fail' + JSON.stringify(err));
                            return;
                        }
                        console.log('send baojing on success');
                        })
                      })
                      clearInterval(this.timer3)
                      this.timer3 = setTimeout(() => {

                        this.jingbao= false
                      }, 2000)
                  }
                  })

/*                clearInterval(this.timer2)
                this.timer2 = setInterval(() => {
                }, 1500)*/
            }
            .backgroundColor('#ffeee1e1')
            .width('95%')
            Divider().color(Color.White).strokeWidth(5)
            Row(){
                Text("报警阈值:")
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')

                TextInput({
                  placeholder: "请输入监控值",
                })
                  .width('40%')
                  .onChange((value)=>{
                      this.yuzhi = Number(value)
                  })
            }
            .borderRadius(8)
            .backgroundColor('#ffeee1e1')
            .width('95%')
            .height('12%')
            .margin({ left: 15, right: 15 })
            .align(Alignment.Center)

            Image(this.jingbao? $r("app.media.icon_device_alert") : null)
            .height('15%').align(Alignment.Center).objectFit(ImageFit.Contain)


            }
          }
      }
      }
      .alignItems(HorizontalAlign.Center)
    }
    .backgroundColor('#EDF2F5')
    .height('100%')
    .align(Alignment.Top)
}
}






xiejirui666 发表于 2023-8-1 17:59:20

在移植hi3861代码时,出现结构体定义重复,定义了两次on与off,最后将一个on改为on1,off同理。

xiejirui666 发表于 2023-8-2 17:31:23

今日任务:解决bug,在报警之后,烟雾传感器会有一定几率不上报值,只能在hi3861处改代码,设定阈值,准备使用多线程解决此问题:
if (strcmp(recvbuf, "yanwuon") == 0)
                        {
                                float ppm;
                                Init_E53_SF1();
                                /****传感器校准****/
                                usleep(1000000); // 开机1s后进行校准
                                MQ2_PPM_Calibration();
                                ppm = Get_MQ2_PPM();
                               
                                char data1;
                                sprintf(data1, "%.3f", ppm);
                                ret = send(new_fd, data1, strlen(data1), 0);
                                if (ppm > 21)
                                {
                                        Beep_StatusSet(ON);
                                }
                                else
                                {
                                        Beep_StatusSet(OFF);
                                }
                               
                                bzero(recvbuf, sizeof(recvbuf));
                        };
                }

xiejirui666 发表于 2023-8-2 17:33:50

学习多线程代码:
void thread1(void)
{
    int sum=0;
    while (1)
    {
      /* code */
      printf("This is BearPi-HM_Nano Thread1----%d\r\n",sum++);
      usleep(1000000);
    }
}

void thread2(void)
{
    int sum=0;
    while (1)
    {
      /* code */
      printf("This is BearPi-HM_Nano Thread2----%d\r\n",sum++);
      usleep(500000);
    }   
}

static void Thread_example(void)
{
    osThreadAttr_t attr;

    attr.name = "thread1";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024*4;
    attr.priority = 25;

    if (osThreadNew((osThreadFunc_t)thread1, NULL, &attr) == NULL) {
      printf("Falied to create thread1!\n");
    }

    attr.name = "thread2";
   
    if (osThreadNew((osThreadFunc_t)thread2, NULL, &attr) == NULL) {
      printf("Falied to create thread2!\n");
    }
}

xiejirui666 发表于 2023-8-2 17:55:41

烟感系统暂时告一段落最终代码:
import socket from '@ohos.net.socket';
import router from '@ohos.router'

@Component
struct PageTitle {
build() {
    Row() {
      Image($r('app.media.back'))
      .width(20)
      .height(20)
      .onClick(() => {
          router.back()
      })
      Text("烟雾传感器")
      .fontSize(22)
      .margin({ left: 20 })
    }
    .padding(12)
    .width('100%')
}
}

@Entry
@Component
struct taideng {
@State imageBgColorA: number = 0
@State ledon: boolean = false
@State recv: string = '0'
@State time: boolean = false
@State time1: boolean = false
@State jingbao: boolean =false
@State timer: number = 0
@State timer2: number = 0
@State timer3: number = 0
@State timer4: number = 0
@State yanwu: number = 0
@State yuzhi: number = 25
@StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm'
//   tcp = socket.constructTCPSocketInstance();


build() {
    Scroll() {
      Column() {
      PageTitle()
      Stack({ alignContent: Alignment.BottomStart }) {
          Image(this.ledon ? $r("app.media.icon_fraction_smoke_online") : $r("app.media.icon_fraction_smoke_offline"))
            .backgroundColor(`rgba(255, 255, 255, ${this.imageBgColorA})`)
            .objectFit(ImageFit.Contain)
      }
      .height(this.currentBreakpoint == 'lg' ? 166 : 280)

      List() {

          ListItem() {
            Column() {
            Button({ type: ButtonType.Normal, stateEffect: false }) {
                Row() {
                  Text(this.ledon ? "已打开" : "已关闭")
                  .fontSize(25)
                  .margin({ left: 15, right: 15 })
                  .fontWeight(FontWeight.Bold)
                  .align(Alignment.Center)
                  .width('50%')

                  Image(this.ledon ? $r("app.media.icon_switch_on") : $r("app.media.icon_switch_off"))
                  .objectFit(ImageFit.Contain)
                  .align(Alignment.Center)
                  .width('50%')
                  .onClick(() => {
                      if (!this.ledon) {
                        this.ledon = true
                        clearInterval(this.timer2)
                      this.timer2 = setInterval(() => {

                        globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
                        //   电脑ip
                        //   tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                        console.log('connect success');
                        globalThis.tcp.send({
                            data: 'yanwuon'
                            //此处省略encoding, 默认为utf-8编码格式
                        }, err => {
                            if (err) {
                              console.log('send fail' + JSON.stringify(err));
                              return;
                            }
                            console.log('sendyanwuon success');
                        })
                        });
                        globalThis.tcp.on('message', value => {
                        console.log("on message")
                        let buffer = value.message
                        let dataView = new DataView(buffer)
                        let str = ""
                        for (let i = 0; i < dataView.byteLength; ++i) {
                            str += String.fromCharCode(dataView.getUint8(i))
                        }
                        console.log("on connect received:" + str)
                        this.yanwu = Number(str)
                        });
                        if(this.yanwu >= 21){
                        this.jingbao= true;
                        }
                        else
                        {this.jingbao= false;}

//                        if(this.yanwu >= this.yuzhi){
//
//                        this.jingbao= true;
//
//                        globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
//
//                            console.log('connect success');
//                            globalThis.tcp.send({
//                              data: 'baojing on'
//                              //此处省略encoding, 默认为utf-8编码格式
//                            }, err => {
//                              if (err) {
//                              console.log('send fail' + JSON.stringify(err));
//                              return;
//                              }
//                              console.log('send baojing on success');
//                            })
//                        })
//                        }
//                        clearInterval(this.timer4)
//                        this.timer4 = setInterval(() => {

//                        globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {
//                            //   电脑ip
//                            //   tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
//                            console.log('connect success');
//                            globalThis.tcp.send({
//                              data: this.yuzhi.toString()
//                              //此处省略encoding, 默认为utf-8编码格式
//                            }, err => {
//                              if (err) {
//                              console.log('send fail' + JSON.stringify(err));
//                              return;
//                              }
//                              console.log('sendyanwuon success');
//                            })
//                        });

//
//                        }, 1500)

                      }, 2500)
                      }
                      else{
                        this.ledon =false
                        clearInterval(this.timer2);

                      }
                  })
                }
            }
            .borderRadius(8)
            .backgroundColor('#ffeee1e1')
            .width('95%')
            .height('12%')
            .margin({ left: 15, right: 15 })

            Divider().color(Color.White).strokeWidth(5)

            Row(){
                Text("烟雾浓度:")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')

                Text(this.yanwu.toString()+"ppm")
                  .height('15%')
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('50%')
            }
            .backgroundColor('#ffeee1e1')
            .width('95%')
            Divider().color(Color.White).strokeWidth(5)
            Row(){
                Column(){
                  Text("实时监测:")
                  .fontSize(25)
                  .fontWeight(FontWeight.Bold)
                  .layoutWeight(1)
                  .align(Alignment.Center)
                  .width('100%')
/*                  .onChange(()=>{

//                      clearInterval(this.timer4)
//                      this.timer4 = setInterval(() => {

                        if(this.yanwu >= this.yuzhi){

                        this.jingbao= true;

                        globalThis.tcp.connect({ address: globalThis.mixeraddr, timeout: 6000 }, () => {

                            console.log('connect success');
                            globalThis.tcp.send({
                              data: 'baojing on'
                              //此处省略encoding, 默认为utf-8编码格式
                            }, err => {
                              if (err) {
                              console.log('send fail' + JSON.stringify(err));
                              return;
                              }
                              console.log('send baojing on success');
                            })
                        })
                        }
//                      }, 1500)
                  })*/
                }.width('50%')

                TextInput({
                  placeholder: "输入阈值(默认25ppm)",
                })
                  .width('50%')
                  .onChange((value)=>{
                      this.yuzhi = Number(value)
                  })
            }
            .borderRadius(8)
            .backgroundColor('#ffeee1e1')
            .width('95%')
            .height('12%')
            .margin({ left: 15, right: 15 })
            .align(Alignment.Center)

            Image(this.jingbao? $r("app.media.icon_device_alert") : null)
            .height('15%').align(Alignment.Center).objectFit(ImageFit.Contain)


            }
          }
      }
      }
      .alignItems(HorizontalAlign.Center)
    }
    .backgroundColor('#EDF2F5')
    .height('100%')
    .align(Alignment.Top)
}
}






xiejirui666 发表于 2023-8-3 18:27:40

今日写人体感应ui和实际功能UI代码:
import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
@Component
struct PageTitle {
build() {
    Row() {
      Image($r('app.media.back'))
      .width(20)
      .height(20)
      .onClick(() => {
          router.back()
      })
      Text("人体感应")
      .fontSize(22)
      .margin({ left: 20 })
    }
    .padding(12)
    .width('100%')
}
}



@Component
struct oneTable {
@State message: string = ''
@State imageBgColorA: number = 0
@StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm'
@State ganying: Boolean = false
@State jingbao: Boolean = false
@State cishu: number = 0
private timer: number = 0
@Builder IngredientItem() {



    Stack({ alignContent: Alignment.BottomStart }) {
      Image(this.jingbao?$r("app.media.ren_youren"):$r("app.media.ren_wuren0"))
      .backgroundColor(`rgba(255, 255, 255, ${this.imageBgColorA})`)
      .objectFit(ImageFit.Contain)
      Text(this.jingbao?"有人靠近":"无人靠近")
      .align(Alignment.Center).width('50%').fontSize(25).height('10%')

    }
    .height(this.currentBreakpoint == 'lg' ? 166 : 280)
    Column() {
      Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center }) {
      Column() {
          Row() {

            Text("人体感应")
            .fontSize(18)
            .fontWeight(FontWeight.Bold)
            .layoutWeight(1)
            .align(Alignment.Start)
            Row() {
            Button('开', { type: ButtonType.Normal, stateEffect: true })
                .borderRadius(8)
                .backgroundColor(0x317aff)
                .width(90)
                .onClick(() => {
                  promptAction.showToast({
                  message: '人体感应已打开',
                  duration: 1500
                  });

                  globalThis.tcp.connect({ address: globalThis.mixeraddr , timeout: 6000 }, () => {
                  //   电脑ip
                  //   tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                  console.log('connect success');
                  globalThis.tcp.send({
                      data: 'rentiganyingon'
                      //此处省略encoding, 默认为utf-8编码格式
                  }, err => {
                      if (err) {
                        console.log('send fail' + JSON.stringify(err));
                        return;
                      }
                      console.log('send success');
                  })
                  })

                  globalThis.tcp.on('message', value => {
                  console.log("on message")
                  let buffer = value.message
                  let dataView = new DataView(buffer)
                  let str = ""
                  this.cishu ++
                  this.jingbao = true
                  clearInterval(this.timer)
                  this.timer = setTimeout(() => {
                      this.jingbao = false
                  }, 500)
                  for (let i = 0; i < dataView.byteLength; ++i) {
                      str += String.fromCharCode(dataView.getUint8(i))
                  }
                  console.log("on connect received:" + str)

                  });



                })
            Blank()
            Button('关', { type: ButtonType.Normal, stateEffect: true })
                .borderRadius(8)
                .backgroundColor(0x317aff)
                .width(90)
                .onClick(() => {

                  promptAction.showToast({
                  message: '人体感应已关闭',
                  duration: 1500
                  });
                  globalThis.tcp.connect({ address: globalThis.mixeraddr , timeout: 6000 }, () => {
                  //   电脑ip
                  //   tcp.connect({ address: { address: '192.168.2.125', port: 3861, family: 1 }, timeout: 6000 }, () => {
                  console.log('connect success');
                  globalThis.tcp.send({
                      data: 'rentiganyingoff'
                      //此处省略encoding, 默认为utf-8编码格式
                  }, err => {
                      if (err) {
                        console.log('send fail' + JSON.stringify(err));
                        return;
                      }
                      console.log('send success');
                  })
                  })
                })
            }
            .width('100%')
            .layoutWeight(2)
          }
          .padding(20)
          .margin({ bottom: 20 })

          Row(){
            Text('报警日志:')
            .align(Alignment.Center)
            .width('40%')
            Text(this.cishu.toString()+"次")
            .width('40%').align(Alignment.Center)
          }

      }

      }

    }.height('50%')
    .backgroundColor(Color.White)

}

build() {

    Column() {
      this.IngredientItem()
    }
}
}


@Entry
@Component
struct fengshan {
build() {
    Scroll() {
      Column() {
      PageTitle()
      Swiper() {
          oneTable()
      }
      .clip(new Rect().width('100%').height('100%').radiusWidth(15).radiusHeight(15))
      .itemSpace(20)
      .height(630)
      .indicatorStyle({ selectedColor: Color.Green })
      .margin({ top: 10, right: 10, left: 10 })

      }
      .alignItems(HorizontalAlign.Center)
    }
    .backgroundColor('#EDF2F5')
    .height('100%')
    .align(Alignment.Top)
}
}









xiejirui666 发表于 2023-8-3 18:28:28

hi3861代码有问题:初步为:
        if (strcmp(recvbuf, "rentiganyingon") == 0)
                        {
                               
                                E53_IS1_Init();
                                E53_IS1_Read_Data(Beep_Alarm);
                                while (1)
                                {
                                        osEventFlagsWait(evt_id, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
                                        Beep_StatusSet(ON2);
                                        GpioSetOutputVal(WIFI_IOT_GPIO_IDX_2, 1);
                                        osDelay(200);
                                        Beep_StatusSet(OFF2);
                                        GpioSetOutputVal(WIFI_IOT_GPIO_IDX_2, 0);
                                        char data1 = "baojing";
                                  ret = send(new_fd, data1, strlen(data1), 0);
                                }
                                bzero(recvbuf, sizeof(recvbuf));
                        };
页: 1 [2] 3
查看完整版本: 我司BQ3568-HM开发板与3861开发板实现TCP通讯