查看: 1749|回复: 12

(一)使用AT指令 arduino uno r3+esp8266+mqtt+阿里云 远程数据

[复制链接]

该用户从未签到

发表于 2018-11-25 15:52 | 显示全部楼层 |阅读模式
本帖最后由 jiangzhiwei 于 2018-12-13 17:35 编辑

新人第一次发帖  ,有点小紧张,因为玩了这么久的arduino +8266,
觉得可以发个贴子来整理下自己这么久所学到的一些东西
还有一部分就是,我当时在社区里想找用AT指令开发MQTT 的教程,发现了许多有用的,
但是包括在百度上,都很少有用arduino 连接8266  用at指令去连接mqtt的。
因为我从一开始就是在用uno+8266去做的一个项目,并没有用8266 -01之类的WiFi  开发板,而且试过烧录固件什么的方法,都用过,可能是因为手残吧,都不起反应。
然后现在最终选择去搞懂mqtt协议,用at指令去开发。







然后现在开始写过程
需要准备的材料 :
        一个云服务器  --->搭建了mqtt服务端(至于怎么搭建的,如果有需要可以留言 我在下次发帖发搭建的          教程,其实百度有一大把里)
           Arduino  uno r3  板子一块
            ESP8266 WiFi模块  一块
            杜邦线   若干
             网络调试助手(电脑软件)  
           一个能上网的WiFi 或者热点

在弄MQTT之前,先了解TCP协议,既然我们使用的是AT指令,要知道在8266的AT指令集中,是可以通过AT指令去配置8266本身当做一个TCP客户端或者TCP服务端的,对于TCP怎么建立的还不明白的话,可以参考8266  AT指令集,跟着去配置一下。

然后,mqtt是基于TCP的一个协议,也就是说在TCP连接之后,经过另一层次协议,便可以连接上MQTT,


什么意思呢   我来用调试助手操作一下就知道了,首先知道搭建好的mqtt的ip 和端口号

通信猫

通信猫


点击  “启动”
SS{OKS%DU{{OMIRYSHL~CGR.png   我们可以看到mqtt连接已经建立
当然这是我们直接用网络调试助手,当然可以直接连接。



现在我们试着
再打开一个网络调试助手(建立一个局域网内的 TCP 服务端)记住这个ip和端口号

网络调试助手

网络调试助手
YTWO`Y_1U${PC(IN0K22(55.png 然后启动服务器,就开始监听  这个不要动!!!!!!!把这个挂在后台


然后打开这个 }WAYN(J}DI{NI)8JK`%{3}7.png 把IP和端口号改为上面的,点击启动,

之后你会发现刚刚后台挂着的TCP服务端加入了一个客户端,并且接受到了75个字节的数据!!!(十六进制显示)
V)CDE9}_L77ZL0$$Y4KOPTH.png




这说明MQTT就是一个基于TCP的连接,并且发送了一段16进制的数据,而这一段数据就是请求连接的数据。


现在我们把这段数据复制下来


再建立一个TCP客户端,IP和端口号是自己搭建的MQTT的ip和端口号

}~6UC873JMHN80IFIENRYWD.png



点击连接,会发现连接上了~~~~~
然后发送刚刚复制那段(16进制发送)
G3E76W8YWJ_}AS1IY8Y5~8F.png 你会发现,它收到来自mqqt(服务端)的4个字节的数据,说明连接成功!如果你没在规定的时间内发送这串数据,那么mqtt那边会主动断开你的连接。

这就是连接MQTT的过程!先建立一个TCP客户端连接,然后再规定的时间内发送一串16进制数,示意我请求的是mqtt,这串16进制数代表什么我们后面再说,反正就是,我和MQTT建立了TCP连接,然后MQTT(服务端)需要你在规定时间内出示你的身份,否则会断开连接,
所以你建立TCP后连接后,发送的第一串数据就是你需要建立MQTT的身份证,(还需要说明下,不一定是75字节,取决于你的身份信息的长度:用户名  密码等,这些等会会说到)。



上面是说明了一下MQTT的连接过程,不知道有没有表达明白,首先你要对TCP服务端和客户端的连接了解后才好理解。


理解了上面的就好办了,
接下来第一件事就是在用arduino  uno r3和esp8266  连接,
然后写代码,先用AT指令建立TCP客户端



这一段是我做MQTT之前的,arduino +8266  作为TCP的客户端连电脑(或手机)接服务端,然后传输DHT11温湿度传感器的数据到服务端的代码,凑合着看吧,其实连接的代码就中间那么一小段,后面的都是dht11的传感器的数据处理函数。

至于服务端用电脑的网络调试助手  测试就好了,

kittenblock中小学创客名师推荐的图形化编程软件

/*
 *1.DHT11接Arduino:vcc连3.3v,DATA连A0,GND连GND
 *2.ESP8266连Arduino:TX连0,RX连1,EN和3V3连3.3v,GND连GND
 */

#include <SoftwareSerial.h>
#define DEBUG
#define _baudrate   115200
 
// USB TTL 检错用
#define _rxpin      0
#define _txpin      1
SoftwareSerial debug( _rxpin, _txpin ); // RX, TX
 
// DHT温湿度传感器
#define dht_dpin A0
byte bGlobalErr;
byte dht_dat[5];
 
// ESP8266 Wifi模块 
/*#define SSID "ONEPLUS3"
#define PASS "12345678"
#define IP "192.168.43.125"*/
#define SSID "ese"
#define PASS "12345678"
#define IP "192.168.43.103"
int flame=A5;//定义火焰接口为模拟5 接口
int qiti=A3;
 int val=0;//定义数字变量
 int cal=0;
// 使用 GET格式
String GET = "\rRead sensor: OK\n";
 
void setup() {
    InitDHT();
    Serial.begin( _baudrate );
    debug.begin( _baudrate );
    delay(300);
    sendDebug("AT");
    delay(500);
    if(Serial.find("OK"))
    {
        Serial.println("RECEIVED: OK\nData ready to sent!");
        connectWiFi();
    }
    delay(700);
    }
 
void loop() {
  ReadDHT();
  switch(bGlobalErr){
     case 0:
        String TT,HH;
        HH = String(dht_dat[0])+'.'+String(dht_dat[1]);
        TT = String(dht_dat[2])+'.'+String(dht_dat[3]);
        val=analogRead(flame);//读取火焰传感器的模拟值 
        cal=analogRead(qiti);
        Serial.println(val);
        Serial.println(cal);//输出模拟值,并将其打印出来
        updateDHT11( TT, HH );        
        #ifdef DEBUG
            debug.print("Humidity: "); 
            debug.print( HH );
            debug.print(" %\t");
            debug.print("Temperature: "); 
            debug.print( TT );
            debug.println(" *C\t");
        #endif
     
  }
  delay(500);
}
 
void updateDHT11( String T, String H )
{
    // 使用AT指令上传
    String cmd = "AT+CIPSTART=\"TCP\",\"";
    cmd += IP;
    cmd += "\",8080";
    sendDebug(cmd);
    delay(1000);
    if( Serial.find( "Error" ) )
    {
        Serial.print( "RECEIVED: Error\nExit1" );
        return;
    }
    cmd ="Temperature="+T+"oC  Humidity="+H+"%"+ " Flame="+val+ "  Qiti: "+cal+"\r\n" ;
    Serial.print( "AT+CIPSEND=" );
    Serial.println( cmd.length());
    if(Serial.find( ">" ) )
    {
        debug.print(">");
        debug.print(cmd);
        Serial.print(cmd);
    }
    else
    {
        sendDebug( "AT+CIPCLOSE" );
    }
    if( Serial.find("OK") )
    {
        debug.println( "RECEIVED: OK" );
    }
    else
    {
        debug.println( "RECEIVED: Error\nExit2" );
    }
}
 
void sendDebug(String cmd)
{
    // 传到 USB TTL
    debug.print("SEND: ");
    debug.println(cmd);
    Serial.println(cmd);
} 
  
boolean connectWiFi()
{
    // 连接到Wifi
    Serial.println("AT+RST");
    delay(1000);
    Serial.println("AT+CWMODE=1");
    delay(1000);
    String cmd="AT+CWJAP=\"";
    cmd+=SSID;
    cmd+="\",\"";
    cmd+=PASS;
    cmd+="\"";
    sendDebug(cmd);
    delay(2000);
    if(Serial.find("OK"))
    {
        debug.println("RECEIVED: OK");
        return true;
    }
    else
    {
        debug.println("RECEIVED: Error");
        return false;
    }
     cmd = "AT+CIPMUX=0";
     sendDebug( cmd );
    if( Serial.find( "Error") )
    {
        debug.print( "RECEIVED: Error" );
        return false;
    }
}
void InitDHT(){
   // 初始化DHT
   pinMode(dht_dpin,OUTPUT);
   digitalWrite(dht_dpin,HIGH);
}
 
void ReadDHT(){
bGlobalErr=0;
byte dht_in;
byte i;
digitalWrite(dht_dpin,LOW);
delay(20);
 
digitalWrite(dht_dpin,HIGH);
delayMicroseconds(40);
pinMode(dht_dpin,INPUT);
 
dht_in=digitalRead(dht_dpin);
 
if(dht_in){
   bGlobalErr=1;
   return;
   }
delayMicroseconds(80);
dht_in=digitalRead(dht_dpin);
 
if(!dht_in){
   bGlobalErr=2;
   return;
   }
delayMicroseconds(80);
for (i=0; i<5; i++)
   dht_dat = read_dht_dat();
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
byte dht_check_sum =
       dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
if(dht_dat[4]!= dht_check_sum)
   {bGlobalErr=3;}
};
 
byte read_dht_dat(){
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++){
      while(digitalRead(dht_dpin)==LOW);
      delayMicroseconds(30);
      if (digitalRead(dht_dpin)==HIGH)
     result |=(1<<(7-i));
    while (digitalRead(dht_dpin)==HIGH);
    }
  return result;
}





总得来说    就是将arudino当成PC串口调试助手,利用arduino 用串口通信发指令给8266,去建立一个TCP客户端




这一篇就到这里,用于理解解TCP和  MQTT,后面我会再更新去讲解建立MQTT的连接的那串数据代表说明
。然后如和用AT指令   在建立了连接的基础上去连接MQTT,以及修改后的  完整代码。


如果对于arduino +8266   AT指令建立TCP 客户端不了解 的  的或者搭建MQTT  云服务器不了解的   评论底下留言   我会教程如何搭建搭建。



在建立了TCP客户端之后,便可以开始写指令去建立MQTT连接了~~~~~以及消息的推送和接收
移步下一篇  (等我更新吧~~~~)





还在不断学习中~~~~
第一次发帖,还望多多关照~~~~
物联网学习 交流群 :439237650
QQ  804034739  (加时请备注)


从上边复制的代码自动把一个地方的中括号给清除了,所以直接复制会有编译错误,下面附件传上~


第二篇
(二)AT 指令开发MQTT    TCP--MQTT的转化
https://www.arduino.cn/forum.php?mod=viewthread&tid=82905&fromuid=162671
(出处: Arduino中文社区)





ESP8266.zip

1.88 KB, 下载次数: 17

  • TA的每日心情
    无聊
    2019-1-3 10:35
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2018-11-26 10:00 | 显示全部楼层
    不错,刚好需要,才接触arduino不到一个月

    该用户从未签到

    发表于 2018-12-5 01:19 | 显示全部楼层
    说好的阿里云呢?

    该用户从未签到

     楼主| 发表于 2018-12-6 13:32 | 显示全部楼层
    qq667121 发表于 2018-12-5 01:19
    说好的阿里云呢?

    阿里云搭建mqtt吗?

    该用户从未签到

    发表于 2018-12-13 12:57 | 显示全部楼层
    你好,我执行这段代码的时候出现了这个错误:In function 'void ReadDHT()',怎么解决啊
  • TA的每日心情
    难过
    2018-12-12 09:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2018-12-13 17:10 | 显示全部楼层
    非常好,向你学习

    该用户从未签到

     楼主| 发表于 2018-12-13 17:29 | 显示全部楼层
    llyyy111 发表于 2018-12-13 12:57
    你好,我执行这段代码的时候出现了这个错误:In function 'void ReadDHT()',怎么解决啊 ...

    dht_dat= read_dht_dat();    这一行改成dht_dat= read_dht_dat();

    (我把代码复制上去后这个括号就没有了不知道为什么.)

    该用户从未签到

     楼主| 发表于 2018-12-13 17:30 | 显示全部楼层
    jiangzhiwei 发表于 2018-12-13 17:29
    dht_dat= read_dht_dat();    这一行改成dht_dat= read_dht_dat();

    (我把代码复制上去后这个括号就没 ...

    dht_dat= read_dht_dat();

    该用户从未签到

     楼主| 发表于 2018-12-13 17:33 | 显示全部楼层

    代码附件已上传,这个不知道为什么我一打那个括号就不显示出来,自动给我清除了

    该用户从未签到

     楼主| 发表于 2018-12-13 17:34 | 显示全部楼层
    llyyy111 发表于 2018-12-13 12:57
    你好,我执行这段代码的时候出现了这个错误:In function 'void ReadDHT()',怎么解决啊 ...

    代码附件已上传,这边给我自动把中括号清除了
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    博哥零基础教你玩转ESP8266(十三) ESP8266WiFiGeneric库
    博哥零基础教你玩转ESP826
    帖子导航帖 博哥零基础教你玩转ESP8266(一) 重识ESP8266 博哥零基础教你玩转ESP8266
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ)
    求助!WeMos D1 WiFi怎么
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ) 想用WeMos D1 WiFi接收服务器的数据然
    串口发送16进制指令求助
    串口发送16进制指令求助
    我准备串口发出16进制指令到我的外置设备 代码如下图 我分别监控ARDUINO的tx口和USB口
    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    大神们!1602显示屏上的MQ2浓度示数不是实时监测的何解
    大神们!1602显示屏上的MQ
    本人小白,刚刚接触arduino,长时间的查阅资料后,通过复制修改代码接线实现了DHT11实
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表