12121| 13
|
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验 |
厕所里偶遇城武、彦祖、志玲是怎样的体验? ---Lora模块组网的厕所空位检测装置 自从把这小东西做出来后,路过的同时纷纷问我这是啥东西?就连平时沉默寡言的“僵尸”同事,也禁不住跑过来询问,搞得我好尴尬呀。这东西真的有这么骚吗? 好吧,不卖关子了。我就先说说做这个小东西的初衷吧。我家公司办公区域在二楼,厕所在一楼,中间得走一截比较长的过道,这些都还好啦,关键是僧多肉少,白来号人,却只有3个坑。每次想去上厕所,跋山涉水地来到一楼厕所,一看! 纳尼???客满!!! 那时,我脆弱内心的小草原上跑满了**,一个画面在脑海里不断地重播——《西游降魔》里美娥姐对空虚公子不停地说~“为什么不早说?你为什么不早说?”。对呀,为什么不早说?好,那我就来造一个“可以早说”的装置——4个lora模块搭建的厕所空位显示装置。 思路:用4个lora模块,配置为3从1主的模式,3从分别对应3个厕所坑位;主机接上led点阵屏,显示3个坑位有无人的实时状态;从机分别接入锂电池供电,而主机则接在家用电上;主控芯片均采用FireBeetleBLE 4.1低功耗控制器。 准备所需材料: FireBeetleBLE4.1 低功耗蓝牙控制器(Arduino Pro Mini 3.3V) 4块; 购买链接 FireBeetle萤火虫LoRa无线通信模块(433MHz) 4块; 购买链接 URM07-UART低功耗超声波测距模块 3个; 购买链接 3.7V电池 新型锂子化学聚合充电锂电池 3块; 购买链接 FireBeetle24×8 LED点阵屏(白色) 1块; 购买链接 高品质 micro USB数据线 1根; 购买链接 面包实验杜邦线(公母头) 若干; 购买链接 防水盒子 4个; 某宝有卖 拆废旧双脚插头 1个; 自己想办法【哈哈】 连接原理图如下: (在我们的小装置里,收集端只有a,b,c三个) 硬件部分 先将4个lora模块的跳线给焊上: (D3连CS,D4连RESET) 将电池经由拨动开关跟主控板连上: 焊接超声波模块跟lora模块: 连接主控板与led点阵模块和lora模块(如图连线): 将防水盒子盖子用手钻钻孔,让插头的线穿过,并焊接插头跟BLE主板: 将主机防水盒的正面用拉花锯锯出一个矩形,露出led点阵屏的显示部分 将从机的防水盒用拉花锯拉出一个圆孔,露出超声波探测头,并在侧边拉出一个放置开关的矩形孔(注意:开孔的位置需要考虑到人性化,我选择的位置就是考虑到单手握持时大拇指去拨动开关) 软件部分 先下载要用的库文件:led点阵屏的库文件下载链接; Lora模块的库文件下载链接; 首先是主机的程序: [mw_shl_code=applescript,true]#include <DFRobot_LoRa.h> #include "DFRobot_HT1632C.h" DFRobot_LoRa lora; #if defined( ESP_PLATFORM ) || defined( ARDUINO_ARCH_FIREBEETLE8266 ) //FireBeetle-ESP32 FireBeetle-ESP8266 #define DATA D6 #define CS D2 #define WR D7 #else #define DATA 6 #define CS 2 #define WR 7 #endif DFRobot_HT1632C ht1632c = DFRobot_HT1632C(DATA, WR,CS); uint8_t sendBuf1[] = "aa"; uint8_t sendBuf2[] = "bb"; uint8_t sendBuf3[] = "cc"; uint8_t recvBuf[12]; unsigned int j; char x[4]; char dis[]={"0-0-0"}; void setup() { Serial.begin(115200); while(!lora.init()) { delay(100); } } void loop() { for(j=3;j>0;j--) { unsigned int i=10000; if(j==3) { lora.sendPackage(sendBuf3,2); } if(j==2) { lora.sendPackage(sendBuf2,2); } if(j==1) { lora.sendPackage(sendBuf1,2); } lora.rxInit(); while(i--) { if(lora.waitIrq()) { recvBuf[0]='0'; lora.clearIRQFlags(); lora.receivePackage(recvBuf); Serial.println("here"); Serial.write(recvBuf,2); if(recvBuf[0]=='0') { x[j]='0'; } if(recvBuf[0]=='1') { x[j]='1'; } if(j==1) { dis[0]=x[j]; } if(j==2) { dis[2]=x[j]; } if(j==3) { dis[4]=x[j]; } Serial.println("here1"); Serial.write(dis,5); } } } ht1632c.begin(); ht1632c.isLedOn(true); ht1632c.clearScreen(); ht1632c.setCursor(1,0); ht1632c.print(dis); } [/mw_shl_code] 接下来是3个从机的程序: 从机1: [mw_shl_code=applescript,true]#include <DFRobot_LoRa.h> DFRobot_LoRa lora; #define header_H 0x55 #define header_L 0xAA #define device_Addr 0x11 #define data_Length 0x00 #define get_Dis_CMD 0x02 #define checksum (header_H+header_L+device_Addr+data_Length+get_Dis_CMD) uint8_t len; uint8_t rxBuf[32]; uint8_t txBuf1[]="11"; uint8_t txBuf0[]="00"; unsigned char i=0; unsigned int Distance=0; unsigned char Rx_DATA[8]; unsigned char CMD[6]={header_H,header_L,device_Addr,data_Length,get_Dis_CMD,checksum}; void setup() { Serial.begin(19200); pinMode(2, OUTPUT); pinMode(3, OUTPUT); digitalWrite(3, HIGH); digitalWrite(2, LOW); //D3和D2分别作为VCC和GND为模块提供电源 while(!lora.init()) { delay(100); } lora.rxInit(); } void loop() { if(lora.waitIrq()) { // wait for RXDONE interrupt lora.clearIRQFlags(); len = lora.receivePackage(rxBuf); // receive data if(rxBuf[0]=='a') { for(i=0;i<6;i++){ Serial.write(CMD); } delay(150); i=0; while (Serial.available()){ Rx_DATA[i++]=(Serial.read()); } Distance=((Rx_DATA[5]<<8)|Rx_DATA[6]); if(Distance>=70) { lora.sendPackage(txBuf0,2); } else{ lora.sendPackage(txBuf1,2); } } lora.rxInit(); } } [/mw_shl_code] 从机2: [mw_shl_code=applescript,true]#include <DFRobot_LoRa.h> DFRobot_LoRa lora; #define header_H 0x55 #define header_L 0xAA #define device_Addr 0x11 #define data_Length 0x00 #define get_Dis_CMD 0x02 #define checksum (header_H+header_L+device_Addr+data_Length+get_Dis_CMD) uint8_t len; uint8_t rxBuf[32]; uint8_t txBuf1[]="11"; uint8_t txBuf0[]="00"; unsigned char i=0; unsigned int Distance=0; unsigned char Rx_DATA[8]; unsigned char CMD[6]={header_H,header_L,device_Addr,data_Length,get_Dis_CMD,checksum}; void setup() { Serial.begin(19200); pinMode(2, OUTPUT); pinMode(3, OUTPUT); digitalWrite(3, HIGH); digitalWrite(2, LOW); //D3和D2分别作为VCC和GND为模块提供电源 while(!lora.init()) { delay(100); } lora.rxInit(); } void loop() { if(lora.waitIrq()) { // wait for RXDONE interrupt lora.clearIRQFlags(); len = lora.receivePackage(rxBuf); // receive data if(rxBuf[0]=='c') { for(i=0;i<6;i++){ Serial.write(CMD); } delay(150); i=0; while (Serial.available()){ Rx_DATA[i++]=(Serial.read()); } Distance=((Rx_DATA[5]<<8)|Rx_DATA[6]); if(Distance>=70) { lora.sendPackage(txBuf0,2); } else{ lora.sendPackage(txBuf1,2); } } lora.rxInit(); } } [/mw_shl_code] 从机3: [mw_shl_code=applescript,true]#include <DFRobot_LoRa.h> DFRobot_LoRa lora; #define header_H 0x55 #define header_L 0xAA #define device_Addr 0x11 #define data_Length 0x00 #define get_Dis_CMD 0x02 #define checksum (header_H+header_L+device_Addr+data_Length+get_Dis_CMD) uint8_t len; uint8_t rxBuf[32]; uint8_t txBuf1[]="11"; uint8_t txBuf0[]="00"; unsigned char i=0; unsigned int Distance=0; unsigned char Rx_DATA[8]; unsigned char CMD[6]={header_H,header_L,device_Addr,data_Length,get_Dis_CMD,checksum}; void setup() { Serial.begin(19200); pinMode(2, OUTPUT); pinMode(3, OUTPUT); digitalWrite(3, HIGH); digitalWrite(2, LOW); //D3和D2分别作为VCC和GND为模块提供电源 while(!lora.init()) { delay(100); } lora.rxInit(); } void loop() { if(lora.waitIrq()) { // wait for RXDONE interrupt lora.clearIRQFlags(); len = lora.receivePackage(rxBuf); // receive data if(rxBuf[0]=='b') { for(i=0;i<6;i++){ Serial.write(CMD); } delay(150); i=0; while (Serial.available()){ Rx_DATA[i++]=(Serial.read()); } Distance=((Rx_DATA[5]<<8)|Rx_DATA[6]); if(Distance>=70) { lora.sendPackage(txBuf0,2); } else{ lora.sendPackage(txBuf1,2); } } lora.rxInit(); } } [/mw_shl_code] |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed