中间是主控板,毕设的主要功能是温湿度、光敏的数据能够发送到云端查看,然后进行语音控制。 左边这个I2C总线有两个引脚,这两个引脚同时连接了ADS1115模块、EERROM模块、BH1750模块和 HDC1080模块,这四个模块都是通过I2C通信的,它们都连在同一个引脚上,通过地址的不同去区别他们。主控板就是这样获得数据的。(如果是用树莓派,或者什么python之类的话,应该是直接调一个函数,然后它就可以直接获得这个光敏的数据和温湿度的这些数据。STM32只不过就是你自己在里面要写.C.H的代码。)
其它像PM2.5的传感器、短信收发模块(配置好以后,它会自动发一个短信)、屏幕(正点原子的屏幕)、LD33211语音模块(可以发数据给这个给单片机)、LORA模块、ESP8266等,都是通过串口连接。
LORA模块和节点板之间的数据,相当于是透明传输,主控板给他发数据,那个节点就能收到。在节点板上面,我也放了一个和主控板一样的小的温湿度传感器。ESP8266可以连到one net平台。其实,我的毕设做的就是把光敏、温湿度的数据还有PH2.5之类的数据都读取以后通过ESP8266发送到one net云平台,通过屏幕显示和语音模块实现和用户的交互。语音模块是别人做好的,我只是用了它通过串口连接(语音模块通过什么协议怎么连接的要知道)。
a)传感器技术指标
b)怎么用:(主要用RX和TX)
c)主动式传输协议(这个模块通电以后,它就默认的TX和RX引脚往外发送数据,外面用一个单片机去接收对应的数据,把它读出来,然后解码就可以就得到对应的PM2.5的值。这就是主动传输,你只要对应的去解码就可以了。)
“默认波特率:9600bps 校验位:无 停止位:1 位”
解释:它的波特率是9600,没有奇偶校验位,停止位是一位,把串口配置成这个模式就可以了。
“协议总长度:32 字节”
解释:它每次(比如说每隔一秒钟)就会发32个字节的数据给你。你只要给他通了电,即VCC、GND一接,它就会通过串口这钟格式自动地刷刷给你发送数据。(不是乱码,比如0x42, 0x4d, 0x52, 0x62,这种数据每次会发送32个字节,一秒发32个,下一秒再发32个,这就是一帧数据,相当于数据帧。)
起始符的作用:相当于引导码、头指针,或者说数据之间进行分割的这种标识的东西。通过引导码区别两帧数据。
S1)接在串口1上,对串口1进行相关配置
说明书中串口1波特率是9600
说明书中没有奇偶校验位,1个停止位
GPIO口的配置
S2) 串口配置好以后,开启串口中断
开启串口中断,(串口中断:串口收到数据时,会进入中断服务函数,如图)。
当一个事件发生的时候,如果配置了中断,它就会进入一个中断服务函数,在那个中断服务函数里面执行完毕了以后,再出去,回到刚才程序执行的地方,然后继续往下走。
进入串口一的中断,在串口一中断里面。判断就是否收到中断的这种标志位,如果这个串口一它的接收中断不是reset,那么就说明他它是因为他中断发生了以后,set会变成1的,就是中断标志位置1,判断这个中断标志位接收中断是不是变成1,如果是的,就进入if的语句,就说明我有中断了,然后读取。代码中定义了u8的变量(unsigned8)
读这个串口1过来的第一个数据,存在BUF,这是定义了一个数组变量,这个数组就是一个缓冲区。我定义了一个数组,这个数组是空的,方便来存放这个数据的,他每次是32个字节,所以就是定义32个,正点原子例程里定义是200个,也行,其实32个就行了,其实32个就够了,因为我们每次只收32个数据。就定义这么一个缓冲区。
把先收到的第一个数据给缓冲区以后,这个里面相当于是一个变量,给它加一。比如说我读到的第一个数据是放在数组零那个单元格的,零数组在第零个单元格,然后第二个读了以后就给他加一,那么下一回再过来,别人再给你发数据的时候,它就放到了一号单元格。因为它这里加了一,下一次发就放到了二号单元格,这样的话就能够收到发过来的数据。然后我在这里if判断,第零个就是第一个我收到的数据是不是0X42。因为协议当中讲了第一个应该是0X42,第二个是不是0X4D。如果第一个不是0X42第二个也不是0X4D的话,那就说明数据是错的,就是没有收到。给它赋值0,就永远是在第一个区域收数据,那它这个指针就永远是零。
如果说它第一个收到的数据是0X42,第二个是0X4D,那么这条语句就不会被执行,它后面的数据就接着能被收,收到的是正确的数据(因为头指针是对的,头两个数据是对的)。说明后面是真的给我们发送的数据,收到的大于31就是变成了32,也就意味着前面零到31,我们已经收满了,就是一共收了32个数据,因为他每次就是如果发送正确的话,应该是给我们发32个字节。当它大于31的时候,我认为我那32个数据就是这个传感器给我发的这32个字节。
接下来这32个字节,收到缓冲区,即定义的这个BUF的数组里面。接下来要读哪一位就读哪一位。一二位是0x42,0x4d。18的话,就是前面已经收了0~17共18个数据,18=2+2*9,即读取第9个数据。
转换完以后,数据已经获得完了,这时再把指针清零。串口再给我发数据的时候,那我这个从这个串口读到的数据就是放在这个缓冲区的第0号单元格。这样PM2..5传感器的数据就读出来了,你只要把它显示出来就可以,显示在屏幕上也可以,通过串口,使用正点原子的例程。
(注释掉了,因为每次测试,都会发送短信,要花钱)
本地编码“短信中心号(倒叙)、目标手机(倒叙)、短信内容(倒叙)”
(与蓝桥杯类似,不赘述)(模块gy30)(放开发板边上,以免受开发板干扰)
mqtt是什么?(代理,发布者,订阅者)(专门为低带宽、高延迟或不可靠的网络设计的)(易于实现、数据传输的服务质量可控、占用带宽小、传输数据内容不可预知、设备连接状态可知)
esp8266.c中修改一下热点名和密码;
onenet.c中修改一下产品ID、鉴权信息、设备ID。
收发信息:
在云平台新建一个设备。
LD3322模块,操作简单,几乎0代码。登录智能公元。
一定要先说唤醒词~
麦克风配置是单麦克风还是双麦克风?单麦克风,因为模块上只有一个麦克风;
进厂还是原厂的?原厂的……
S1)想要做哪些功能,对应哪些接口(串口5是SD卡,用不了),分配好引脚;
S2)画原理图和立创上没有的封装;
S3)画PCB(半个月)自己连线(比较复杂,无法自动布线)(两个开发板,主控板和节点板);
S4)焊接和代码(可以用正点原子的先写代码)焊好以后要一个一个测试,捷配打板;
没有什么创新,开发板完全由自己焊接制作(省钱,锻炼);
为什么没做贴片,风险大,害怕来不及做;
和正点原子的区别:没有用排针(更适于开发),全部引出来做了接口(更适于用);
布线都是差分布线,都是自己算的,高速信号线。要走高速信号一样,因为频率高了以后,如果你这个这个距离不一样的话,那数据传输的时候会出现错误的(正点原子这个地方都没有差分布线,但是这次是为了严谨一下,学生说就换个差分布线,其实不差分数据照样传输,问题也不大)
(数字滤波器)
联网一类的数据这个功能都去实现了,去做通了一下,能够把数据传到传到onenet平台上面,能够显示出来,能够这些东西能调通,也是作为一个书本知识的验证。
节点板右边原来是想做数据采集的