【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验

2018-04-162.1万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用FireBeetle BLE 4.1低功耗控制器和Lora模块搭建厕所空位检测装置。该项目通过3从1主模式配置,实时显示3个厕所坑位的占用状态。硬件清单包括FireBeetle BLE 4.1、Lora模块、超声波测距模块、电池、LED点阵屏等。通过连接原理图和详细的硬件部分说明,展示了如何组装和连接各个组件。软件部分提供了主机和从机的程序代码。这个装置可以有效解决厕所排队问题,提高办公区域或公共场所的使用效率。
厕所里偶遇城武、彦祖、志玲是怎样的体验?
---Lora模块组网的厕所空位检测装置

【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图1

       自从把这小东西做出来后,路过的同时纷纷问我这是啥东西?就连平时沉默寡言的“僵尸”同事,也禁不住跑过来询问,搞得我好尴尬呀。这东西真的有这么骚吗?
            好吧,不卖关子了。我就先说说做这个小东西的初衷吧。我家公司办公区域在二楼,厕所在一楼,中间得走一截比较长的过道,这些都还好啦,关键是僧多肉少,白来号人,却只有3个坑。每次想去上厕所,跋山涉水地来到一楼厕所,一看!
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图2

纳尼???客满!!!


       那时,我脆弱内心的小草原上跑满了**,一个画面在脑海里不断地重播——《西游降魔》里美娥姐对空虚公子不停地说~“为什么不早说?你为什么不早说?”。对呀,为什么不早说?好,那我就来造一个“可以早说”的装置——4个lora模块搭建的厕所空位显示装置。
       思路:用4个lora模块,配置为3从1主的模式,3从分别对应3个厕所坑位;主机接上led点阵屏,显示3个坑位有无人的实时状态;从机分别接入锂电池供电,而主机则接在家用电上;主控芯片均采用FireBeetleBLE 4.1低功耗控制器。


准备所需材料:
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图3

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个;                                       自己想办法【哈哈】


连接原理图如下:
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图4

(在我们的小装置里,收集端只有a,b,c三个)



硬件部分
先将4个lora模块的跳线给焊上:

【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图5

(D3连CS,D4连RESET)

将电池经由拨动开关跟主控板连上:
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图6


焊接超声波模块跟lora模块:
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图7


连接主控板与led点阵模块和lora模块(如图连线):
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图8

将防水盒子盖子用手钻钻孔,让插头的线穿过,并焊接插头跟BLE主板:
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图9

将主机防水盒的正面用拉花锯锯出一个矩形,露出led点阵屏的显示部分

【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图10

将从机的防水盒用拉花锯拉出一个圆孔,露出超声波探测头,并在侧边拉出一个放置开关的矩形孔(注意:开孔的位置需要考虑到人性化,我选择的位置就是考虑到单手握持时大拇指去拨动开关)
【Firebeetle教程】厕所里偶遇城武、彦祖、志玲是怎样的体验图11

软件部分
先下载要用的库文件: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]

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(6)
微草
微草

gray6666
gray6666
尴尬,尴尬。。。。。。。。。。。。
Chocho2017
Chocho2017
作者
回复hnyzcj
嗯。。。。。。。。想象。
hnyzcj
hnyzcj回复Chocho2017
你遇到林志玲了
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
许培享
许培享
现在的蓝牙4.0以上是不是可以一对多
Chocho2017
Chocho2017
作者
回复许培享
可以,但是传输距离有限。
luna
luna
楼主脑洞真大啊~~
Chocho2017
Chocho2017
作者
回复luna
嗯嗯,是上厕所总结出来的。
hnyzcj
hnyzcj
版主为民考虑周全
Chocho2017
Chocho2017
作者
回复hnyzcj
亲民的作品,哈哈。
许培享
许培享
版主为民着想!
Chocho2017
Chocho2017
作者
回复许培享
虽然不美观,但是很亲民。
- 没有更多了 -