【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模块的库文件下载链接;首先是主机的程序:#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;
unsigned int j;
char x;
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';
lora.clearIRQFlags();
lora.receivePackage(recvBuf);
Serial.println("here");
Serial.write(recvBuf,2);
if(recvBuf=='0')
{
x='0';
}
if(recvBuf=='1')
{
x='1';
}
if(j==1)
{
dis=x;
}
if(j==2)
{
dis=x;
}
if(j==3)
{
dis=x;
}
Serial.println("here1");
Serial.write(dis,5);
}
}
}
ht1632c.begin();
ht1632c.isLedOn(true);
ht1632c.clearScreen();
ht1632c.setCursor(1,0);
ht1632c.print(dis);
}
接下来是3个从机的程序:
从机1:#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;
uint8_t txBuf1[]="11";
uint8_t txBuf0[]="00";
unsigned char i=0;
unsigned intDistance=0;
unsigned char Rx_DATA;
unsigned char CMD={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=='a')
{
for(i=0;i<6;i++){
Serial.write(CMD);
}
delay(150);
i=0;
while (Serial.available()){
Rx_DATA=(Serial.read());
}
Distance=((Rx_DATA<<8)|Rx_DATA);
if(Distance>=70)
{
lora.sendPackage(txBuf0,2);
}
else{
lora.sendPackage(txBuf1,2);
}
}
lora.rxInit();
}
}
从机2:#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;
uint8_t txBuf1[]="11";
uint8_t txBuf0[]="00";
unsigned char i=0;
unsigned intDistance=0;
unsigned char Rx_DATA;
unsigned char CMD={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=='c')
{
for(i=0;i<6;i++){
Serial.write(CMD);
}
delay(150);
i=0;
while (Serial.available()){
Rx_DATA=(Serial.read());
}
Distance=((Rx_DATA<<8)|Rx_DATA);
if(Distance>=70)
{
lora.sendPackage(txBuf0,2);
}
else{
lora.sendPackage(txBuf1,2);
}
}
lora.rxInit();
}
}
从机3:#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;
uint8_t txBuf1[]="11";
uint8_t txBuf0[]="00";
unsigned char i=0;
unsigned intDistance=0;
unsigned char Rx_DATA;
unsigned char CMD={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=='b')
{
for(i=0;i<6;i++){
Serial.write(CMD);
}
delay(150);
i=0;
while (Serial.available()){
Rx_DATA=(Serial.read());
}
Distance=((Rx_DATA<<8)|Rx_DATA);
if(Distance>=70)
{
lora.sendPackage(txBuf0,2);
}
else{
lora.sendPackage(txBuf1,2);
}
}
lora.rxInit();
}
}
版主为民着想! 版主为民考虑周全 安卓机器人 发表于 2018-4-16 20:08
版主为民着想!
虽然不美观,但是很亲民。 hnyzcj 发表于 2018-4-17 08:13
版主为民考虑周全
亲民的作品,哈哈。 楼主脑洞真大啊~~ 现在的蓝牙4.0以上是不是可以一对多{:5_118:} 安卓机器人 发表于 2018-4-17 10:09
现在的蓝牙4.0以上是不是可以一对多
可以,但是传输距离有限。 luna 发表于 2018-4-17 09:27
楼主脑洞真大啊~~
嗯嗯,是上厕所总结出来的。 尴尬,尴尬。。。。。。。。。。。。 gray6666 发表于 2018-4-17 15:20
尴尬,尴尬。。。。。。。。。。。。
哈哈,是不是不敢上厕所拉?
Chocho2017 发表于 2018-4-17 15:26
哈哈,是不是不敢上厕所拉?
你遇到林志玲了 hnyzcj 发表于 2018-4-17 19:28
你遇到林志玲了
嗯。。。。。。。。想象。
页:
[1]