Chocho2017 发表于 2018-4-16 15:39:28

【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:18

版主为民着想!

hnyzcj 发表于 2018-4-17 08:13:44

版主为民考虑周全

Chocho2017 发表于 2018-4-17 09:15:21

安卓机器人 发表于 2018-4-16 20:08
版主为民着想!

虽然不美观,但是很亲民。

Chocho2017 发表于 2018-4-17 09:15:31

hnyzcj 发表于 2018-4-17 08:13
版主为民考虑周全

亲民的作品,哈哈。

luna 发表于 2018-4-17 09:27:51

楼主脑洞真大啊~~

安卓机器人 发表于 2018-4-17 10:09:10

现在的蓝牙4.0以上是不是可以一对多{:5_118:}

Chocho2017 发表于 2018-4-17 11:25:09

安卓机器人 发表于 2018-4-17 10:09
现在的蓝牙4.0以上是不是可以一对多

可以,但是传输距离有限。

Chocho2017 发表于 2018-4-17 11:25:45

luna 发表于 2018-4-17 09:27
楼主脑洞真大啊~~

嗯嗯,是上厕所总结出来的。

gray6666 发表于 2018-4-17 15:20:39

尴尬,尴尬。。。。。。。。。。。。

Chocho2017 发表于 2018-4-17 15:26:41

gray6666 发表于 2018-4-17 15:20
尴尬,尴尬。。。。。。。。。。。。

哈哈,是不是不敢上厕所拉?

hnyzcj 发表于 2018-4-17 19:28:07

Chocho2017 发表于 2018-4-17 15:26
哈哈,是不是不敢上厕所拉?

你遇到林志玲了

Chocho2017 发表于 2018-4-18 10:31:56

hnyzcj 发表于 2018-4-17 19:28
你遇到林志玲了

嗯。。。。。。。。想象。

微草 发表于 2018-4-20 13:41:04

页: [1]
查看完整版本: 【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验