基于ESP8266称重式压力传感器(接入阿里云物联网平台)

Hello!我叫RUROBO,能力有限,如果有错误请更正!

钉钉!收到一个任务

基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第1张图片

引言

​ “来,一起读一下题目——基于Arduino…”想了想(有个奇怪的想法),毅然决然,我要作一下(此处需要黑人抬棺video)。
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第2张图片

皮一下肿么了!严肃认真,开始进入正文

​ 将基于Arduion的开发,换成基于ESP8266(乐鑫公司—— 针对物联网应用提供一整套灵活多样的解决方案,包括 WiFi 芯片、蓝牙芯片和 WiFi + 蓝牙二合一芯片。)最重的是它是国产的芯片,还有一点,使用ESP8266,能够节约成本,而感觉使用Arduino似乎有点儿大材小用(没有足够小钱钱),等真正需要它的时候再召唤它吧。

关于ESP8266和阿里云IoT hub,乐鑫官方的GitHub上已经有了「ESP8266 对接阿里云」的repository(可供参考)

Come on, just do it!
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第3张图片

一,解读任务书(需求分析)

​ 为了更好的展示ESP8266的性能,先假设一个情景。一家自动化工厂,需要不间断的检测某个产品的重量,同时对于检测结果需要进行处理,如果小于预定阈值或者大于预定的预知,就要将它们进行处理(鉴定为次品)。
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第4张图片

二,搭建实物与软件测试

A Section Hardware

1,拿到实物,开始动手焊接,用面包板连接线路。

2,绘制接线图
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第5张图片
3.实物搭建完成

B Section Software [CPP and Arduion IDE]

1.|4-Digital Display module

#include          
TM16XX Digitron(1,D7,D6);  // D6 ,D7对应的参数是 CLK ,DIO
void setup ()
{
  Digitron.setMode(1); //模式
  Digitron.setBrightness(100); //亮度
}
void loop ()
{
 Digitron.display(0425);  
}

2.Hx711 module

#include 
#include "HX711.h"

float Weight = 0;
TM16XX Digitron(1,D7,D6);

void setup()
{
  Init_Hx711();       
  Serial.begin(9600);//启动串口
  Serial.print("Welcome to RUROBO!\n");
  delay(1000);
  Digitron.setMode(1); 
  Digitron.setBrightness(80); 
  Get_Maopi();   
}

void loop()
{                                                                  
  Weight = Get_Weight();  
  Serial.print(float(Weight/1000*-1),2); 
  Serial.print("kg\n");  
  Serial.print("\n");
  Digitron.display(float(Weight/1000*-1));
  delay(500);        

}
  • 串口监视器
    基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第6张图片
  • 串口绘图
    基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第7张图片
    3.ESP8266WiFi,ArduinoJson,and aliyun-mqtt modules (接入阿里云的c++的库)
#include 
#include "HX711.h"
#include 
#include 
#include 
#include 

float Weight = 0;
TM16XX Digitron(1,D7,D6);
/*-----------------------------MQTT协议与阿里云-----------------------------------------*/
int redLedState0 = 0;
int last0 = 0;
#define LED_BUILTIN D8
unsigned long lastSend = 0;

//你的wifi
#define WIFI_SSID "RUROBO"
#define WIFI_PASSWD "1129407325"

//阿里云三元组
#define PRODUCT_KEY "a1vkXDXLcgP"
#define DEVICE_NAME "LED_BUILTIN"
#define DEVICE_SECRET "3F5iOhQJcJKEUTWcFUbsN97h6VyzWIBE"

//订阅和发布时所需的主题
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
#define ALINK_TOPIC_PROP_POSTRSP "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post_reply"
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
#define ALINK_METHOD_PROP_POST "thing.event.property.post"

//创建WiFiClient实例
WiFiClient espClient;

//创建MqttClient实例
PubSubClient mqttClient(espClient);


//连接Wifi
void initWifi(const char *ssid, const char *password)
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("WiFi does not connect, try again ...");
    delay(500);
  }

  Serial.println("Wifi is connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


//监听云端下发指令并处理 
void callback(char *topic, byte *payload, unsigned int length)
{
     
    Serial.println();
    Serial.println();
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    Serial.println();


    payload[length] = '\0';
    Serial.println((char *)payload);
    //const char *payload = "{"method":"thing.service.property.set","id":"282860794","params":{"LightSwitch":1},"version":"1.0.0"}"


  if (strstr(topic, ALINK_TOPIC_PROP_SET))
    {
        //json解析payload
        StaticJsonBuffer<400> jsonBuffer;
        JsonObject &root = jsonBuffer.parseObject(payload);

        //判断json解析是否成功
        if (!root.success())
        {   
            Serial.println("parseObject() failed");
        } 
        else
        {
            Serial.println("parseObject() success");

            //redLedState0  = json解析后的"S_D0"的值
            redLedState0 = root["params"]["S_D0"];

            digitalWrite(LED_BUILTIN, redLedState0);

        }
    }
}

//连接Mqtt订阅属性设置Topic
void mqttCheckConnect()
{
    bool connected = connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);

    if (connected)
    {
        mqttClient.subscribe(ALINK_TOPIC_PROP_SET); 
    }
}

// 上报属性Topic数据
void mqttIntervalPost()
{
    char param[512];
    char jsonBuf[1024];
   
    sprintf(param, "{\"S_D0\":%d,\"Weight\":%f}", digitalRead(LED_BUILTIN),float(Weight/1000*-1));
    sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);
   /*jsonBuf = "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":"\{\"S_D0\":%d}\"}"(如果可以,了解一下Json知识,主要的核心内容是对键值的认识)*/


    mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf); 
}

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0); 
  initWifi(WIFI_SSID, WIFI_PASSWD); 



  mqttCheckConnect(); //初始化首次链接
  mqttIntervalPost(); //上报初始化数据

  mqttClient.setCallback(callback);

  Init_Hx711();       
  Digitron.setMode(1); 
  Digitron.setBrightness(100); 
  Get_Maopi();
}

void loop()
{   
   if (millis() - lastSend >= 1000)//每隔1s,上报一次最新消息
    {  
        mqttCheckConnect(); 
        lastSend = millis();
        mqttIntervalPost(); 
    }
    mqttClient.loop();                                                               
	Weight = Get_Weight();  
    Digitron.display(float(Weight/10*-1));
    delay(425);        

}

C 来简单的认识一下MQTT协议

0.esp8266的wifi模块
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第8张图片
​ ESP8266共有三种工作模式,分别是APWireless Station以及混合模式(以上两种模式的混合)。 本次实验用到的是 Wireless Station (某种意义上,可以理解为一台小型的服务器,可以实现简单的WebService)

1.Why to use MQTT ?

存在即合理: 与HTTP相比,MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议【低能耗】,使其在物联网、小型设备、移动应用等方面有较广泛的应用。 (关于机器人,ROS系统也涉及此协议。)

2.What is MQTT ?

​ MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第9张图片
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第10张图片

蓝线条——张三关注了罗翔老师。因此,当罗翔老师发布关于刑法的视频,那么张三就可以收到哔哩哔哩代理推送的#【罗翔】法治之良法而治,于是乎张三看到了视频,不自觉再弹幕里发送 害怕

黄线条——罗翔老师关注了张三。因此,当张三发布了关于要好好学刑法的视频,那么罗翔老师就可收到哔哩哔哩服务器推送的#好好学刑法,于是乎罗翔老师看了之后,一键三连该视频。

另的用户——你好哇请叫我学长关注了罗翔老师,所以可以收到推送,然而罗翔老师没关注他,所以就无论如何也收不到他发布的消息。(图右上角,手机端)


三,接入阿里云平台

1、登陆进入控制台

基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第11张图片
2,进入物联网平台(界面预览)

基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第12张图片

下面开始创建产品和设备获得[ ProductKey, DeviceName , DeviceSecret ]

3.1新创建一个产品并添加功能定义(记得选择自定义品类,便于灵活处理项目)
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第13张图片
基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第14张图片
3.2添加设备获得三元组

基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第15张图片

3.3返回代码将三元组添加到程序中,烧录到ESP8266

基于ESP8266称重式压力传感器(接入阿里云物联网平台)_第16张图片

OVER OVER OVER

四,结束语

RUROBO , 能力有限,如果错误请指正!

小结几点:

  • 做项目先构建一个框架(用思维导图捋清楚目的,需求,以及效果)

  • 不懂的代码,说明你没掌握该问题的底层逻辑[认清实物底层逻辑思维真的非常重要]

  • 不断学习,你的想象力才能更加丰富

    怕是什么真理无穷,进一寸有一寸的欢喜!

五,相关参考资料

#ESP8266example[https://tttapa.github.io/ESP8266/Chap01%20-%20ESP8266.html](https://tttapa.github.io/ESP8266/Chap01 - ESP8266.html)

#太极创客 http://www.taichi-maker.com/homepage/iot-development/

[我的Github] https://github.com/RUROBO/CJM.git [本教程所有的程序已上传到Github]

你可能感兴趣的:(MCU)