自从尽量不使用Wi-Fi模组以后,用蓝牙连接手机,直接传输数据就成了首要的想法。当然,能实现的平台也是很多的,大多平台早已考虑到了这种接入方式。通过蓝牙接入网关,网关通过Wi-Fi或者网线连接至服务器,但是有时候我并不需要连接到服务器,我只是想打开手机的时候看一下,不看就不管了。当然这样的需求很奇葩,纯属吃饱了没事做。所以本文又是一篇水文
Arduino加蓝牙模块进行透传连接至手机不会遇到任何问题,但是写本文的时候我还有个想法就是既然ESP8266对于Arduino的支持这么完整,那为什么不用ESP8266来代替Arduino Uno呢?这又是很奇葩的想法了。这样做真的是实际意义不大

Blinker就是点灯科技是一家成都的创业公司,他们从事的是物联网接入方案,构建物联网平台。他们提供的方案能够涵盖绝大多数的初学者的学习路径。不过大部分blinker提供的例程全是基于Arduino IDE的,说明面向的大部分的用户是??关于arduino是不是玩具的讨论

接入方式

你可能并不苟同我的奇葩做法,或者是你有其他模组,就只是想去试试看,其实官方还提供了下面这些方式的接入,只是还是全是用的Arduino IDE。。。。。。

QQ20200108-111828@2x.webp

下面是文档的目录:

WX20191207-210856@2x.webp

蓝牙模块要求

官方推荐下面的模块作为蓝牙透传模组:

  • openjumper ble串口模块 (默认波特率9600)
  • HM10 / HM11 (默认波特率9600)
  • JDY08 / JDY10 (默认波特率115200)
  • JDY18/JDY09 (默认波特率9600)

以上均为蓝牙4.x模块。
其实蓝牙模组只要满足下面的条件都是可以的。我使用的是AT-09,CC2541,某宝上面有售,非常的便宜,我本来想着多买几块,买个五,六块留着,但是买得越多就越贵,原因是没有首件优惠,也没有店铺优惠,真是奇怪。所以我只买了一块。
上次的这个小玩意里面也是CC2541,也是可以拿来用的。
道瑞X-doria KidFit儿童手环CC2541二次开发
分析使用ESP32将有线键盘转换为蓝牙无线键盘

接入蓝牙设备
设备应为蓝牙4.x版本(带ble)

设备发现
广播服务FFE0,即可被手机搜索到

设备通信
通过读写服务FFE1,即可与手机通信

接入WiFi设备
带局域网通信功能(WiFi、有线均可)

设备发现
设备通过mdns广播设备,可被手机搜索到
如Aduino设备,广播名为_DiyArduino._tcp.local.
Linux设备,广播名为_DiyLinux._tcp.local.

设备通信
在81端口建立webSocket server,手机端进去控制面板后会自动连接到该server,即可进行通信

官方提供了很多的资料:

使用Arduino & 蓝牙接入

blinker 2.x通信指令

ESP8266+CC2541的蓝牙接入

众所周知的问题是ESP8266是没有带上蓝牙功能的。
我确实是还有其他的Arduino设备,比如Arduino UNO(ATmega328P),但是我还是想用ESP8266。但是线路的连接还照旧,如下:
当然传感器的连接,该怎么连接就怎么连接,只要不冲突就好了,如果有冲突了,就自行修改一下引脚就是了。比如我的DHT11,连接了IO5。

左边是ESP8266,右边是CC2541模块。

  • VCC---->5V(VCC)
  • GND---->GND
  • IO12---->TX
  • IO13---->RX

回到IDE,
需要的库会有

#include <SoftwareSerial.h>
#include <Ticker.h>
#include <EEPROM.h>
#include <DHT.h>
#include <ESP8266WiFi.h>

你如果是Arduino就不需要引入了,Blinker的头已经带上了。SoftwareSerial是软串口,需要通过软串口建立与蓝牙模组的连接。

src/BlinkerSerialBLE.h
    #elif defined(ESP8266)
            BApi::begin();
            SSerialBLE = new SoftwareSerial(ss_rx_pin, ss_tx_pin);
            SSerialBLE->begin(ss_baud);
            Transp.begin(*SSerialBLE, false);
            transport(Transp);
            // this->conn.begin(*SSerialBLE, false);
            BLINKER_LOG(BLINKER_F("SerialBLE initialized..."));
            return;

QQ20191206-005802@2x.webp

QQ20191206-005825@2x.webp

通过搜索设备可以搜到,连接后就是下图这样:

Screenshot_20191208-150746.webp

打开后是这样,当然这里的控件是自己定义的:

Screenshot_20191208-150736.webp

定义这个就很简单明了,全图形化操作。

Screenshot_20191208-144355.webp

Screenshot_20191208-144343.webp

可以看到设备信息:

Screenshot_20191208-150806.webp

不怎么友善的是ESP8266的耗电确实很高,失去了蓝牙的意义了。电流在0.1A左右,是比较耗电的了,用几节干电池供电是不现实的。

IMG_20191208_150851.webp

情况允许的话可以试一下休眠,ESP8266的休眠分为三种模式:

80120-bc6937ffc71b21de.webp

// 一但遇到以下方法ESP就会进入deepSleep状态
ESP.deepSleep(20e6); // 20e6 is 20 microseconds

更多的介绍可以看:ESP8266的低功耗方案-睡眠模式

我使用ESP8266,1分钟采集一次DHT11的数据,再加上CC2541,功耗能做到接近1h,使用24mAh,虽然还是很糟糕,不过还能凑合。不过需要注意的是,如果让ESP8266进入了深度休眠的状态,任何数据都不会发出和响应,你可以认为如同假死了一样。
所以还是老老实实用个单片机,哪怕是ATmega328P,STM32,或者其他的功耗上也能轻松超过ESP8266,毕竟这有点杀鸡用牛刀的感觉。

代码:

/* *****************************************************************

   Download latest Blinker library here:
   https://github.com/blinker-iot/blinker-library/archive/master.zip


   Blinker is a cross-hardware, cross-platform solution for the IoT.
   It provides APP, device and server support,
   and uses public cloud services for data transmission and storage.
   It can be used in smart home, data monitoring and other fields
   to help users build Internet of Things projects better and faster.

   Make sure installed 2.5.0 or later ESP8266/Arduino package,
   if use ESP8266 with Blinker.
   https://github.com/esp8266/Arduino/releases

   Make sure installed 1.0.2 or later ESP32/Arduino package,
   if use ESP32 with Blinker.
   https://github.com/espressif/arduino-esp32/releases

   Docs: https://doc.blinker.app/
         https://github.com/blinker-iot/blinker-doc/wiki

 * *****************************************************************

   Blinker 库下载地址:
   https://github.com/blinker-iot/blinker-library/archive/master.zip

   Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、
   服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、
   数据监测等领域,可以帮助用户更好更快地搭建物联网项目。

   如果使用 ESP8266 接入 Blinker,
   请确保安装了 2.5.0 或更新的 ESP8266/Arduino 支持包。
   https://github.com/esp8266/Arduino/releases

   如果使用 ESP32 接入 Blinker,
   请确保安装了 1.0.2 或更新的 ESP32/Arduino 支持包。
   https://github.com/espressif/arduino-esp32/releases

   文档: https://doc.blinker.app/
         https://github.com/blinker-iot/blinker-doc/wiki

 * *****************************************************************/

#define BLINKER_BLE


//SoftwareSerial mySerial(12, 13); // RX, TX 配置10、11为软串口
#include <Blinker.h>

BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");

// Download Adafruit DHT-sensor-library library here:
// https://github.com/adafruit/DHT-sensor-library
#include <DHT.h>

#define DHTPIN 5

#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

uint32_t read_time = 0;

float humi_read, temp_read;

void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);

  Blinker.vibrate();

  uint32_t BlinkerTime = millis();

  Blinker.print("millis", BlinkerTime);
}

void heartbeat()
{
  HUMI.print(humi_read);
  TEMP.print(temp_read);
}

void setup()
{
  Serial.begin(9600);

  BLINKER_DEBUG.stream(Serial);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  Blinker.begin(12, 13, 9600);
  Blinker.attachData(dataRead);
  Blinker.attachHeartbeat(heartbeat);

  dht.begin();
}

void loop()
{
  Blinker.run();

  if (read_time == 0 || (millis() - read_time) >= 2000)
  {
    read_time = millis();

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      BLINKER_LOG("Failed to read from DHT sensor!");
      return;
    }

    float hic = dht.computeHeatIndex(t, h, false);

    humi_read = h;
    temp_read = t;

    BLINKER_LOG("Humidity: ", h, " %");
    BLINKER_LOG("Temperature: ", t, " *C");
    BLINKER_LOG("Heat index: ", hic, " *C");
  }
  
}

ESP8266的Wi-Fi接入

Screenshot_20191208-144324.webp

Screenshot_20191208-144443.webp

这里需要修改:

  • auth:从APP上面得到,设备的唯一识别码
  • ssid:Wi-Fi网络的名称
  • pswd:Wi-Fi网络的密码

测试代码:

/* *****************************************************************
 *
 * Download latest Blinker library here:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * 
 * Blinker is a cross-hardware, cross-platform solution for the IoT. 
 * It provides APP, device and server support, 
 * and uses public cloud services for data transmission and storage.
 * It can be used in smart home, data monitoring and other fields 
 * to help users build Internet of Things projects better and faster.
 * 
 * Make sure installed 2.5.0 or later ESP8266/Arduino package,
 * if use ESP8266 with Blinker.
 * https://github.com/esp8266/Arduino/releases
 * 
 * Make sure installed 1.0.2 or later ESP32/Arduino package,
 * if use ESP32 with Blinker.
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * Docs: https://doc.blinker.app/
 *       https://github.com/blinker-iot/blinker-doc/wiki
 * 
 * *****************************************************************
 * 
 * Blinker 库下载地址:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、
 * 服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、
 * 数据监测等领域,可以帮助用户更好更快地搭建物联网项目。
 * 
 * 如果使用 ESP8266 接入 Blinker,
 * 请确保安装了 2.5.0 或更新的 ESP8266/Arduino 支持包。
 * https://github.com/esp8266/Arduino/releases
 * 
 * 如果使用 ESP32 接入 Blinker,
 * 请确保安装了 1.0.2 或更新的 ESP32/Arduino 支持包。
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * 文档: https://doc.blinker.app/
 *       https://github.com/blinker-iot/blinker-doc/wiki
 * 
 * *****************************************************************/

#define BLINKER_WIFI

#include <Blinker.h>

char auth[] = "";
char ssid[] = "";
char pswd[] = "";

BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");

// Download Adafruit DHT-sensor-library library here:
// https://github.com/adafruit/DHT-sensor-library
#include <DHT.h>

#define DHTPIN 5

#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

uint32_t read_time = 0;

float humi_read, temp_read;

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}

void heartbeat()
{
    HUMI.print(humi_read);
    TEMP.print(temp_read);
}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);

    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    Blinker.attachHeartbeat(heartbeat);
    
    dht.begin();
}

void loop()
{
    Blinker.run();

    if (read_time == 0 || (millis() - read_time) >= 2000)
    {
        read_time = millis();

        float h = dht.readHumidity();
        float t = dht.readTemperature();        

        if (isnan(h) || isnan(t)) {
            BLINKER_LOG("Failed to read from DHT sensor!");
            return;
        }

        float hic = dht.computeHeatIndex(t, h, false);

        humi_read = h;
        temp_read = t;

        BLINKER_LOG("Humidity: ", h, " %");
        BLINKER_LOG("Temperature: ", t, " *C");
        BLINKER_LOG("Heat index: ", hic, " *C");
    }

    
}

自行编译APP

官方提供了两个用户可以二次开发的开源APP,一个是老版本的APP,一个是一个连接Demo。
官方提供的程序是基于ionic开发的,我看GitHub觉得他们也是为了节约成本的吧,就不独立开发了。

npm install @ionic/app-scripts@latest --save-dev

ionic cordova build android --verbose

顺便再说一下,就是ionic的问题,可以到XX到此一游 | 助人为快乐之本 有恒为成功之本,看一下。

文章目录