(分享+求助)基于 blinker 应用ESP8266模块通信控制 arduino UNO...-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8293|回复: 12

[分享] (分享+求助)基于 blinker 应用ESP8266模块通信控制 arduino UNO...

[复制链接]
发表于 2020-3-7 12:05 | 显示全部楼层 |阅读模式
本帖最后由 seven571245815 于 2020-3-8 10:55 编辑

首先本人为典型小白一名,目前也不太了解和掌握透传知识,相关例子找了很久没找到,想分享给大家,本例子方法和编程可能愚笨请各位包容,也希望给我指出让我进步,谢谢!!本例子不单用ESP8266,而增加应用arduino UNO的初衷是想实现的功能太多,ESP8266的端口有点少满足不了。暂时没想到其他好方法,大神们有其他好方面可推荐一下哦。

一.例子思路
   思路为:
1.使用 blinker软件发送命令给ESP8266模块;
2.ESP8266模块接收命令并反馈给服务器,同时通过串口输出命令给arduino UNO;
3.arduinoUNO接收命令经过处理,判断来控制arduino UNO相应的针口。
说明:本例子主要应用硬串口和软串口通信的知识,想了解相关知识的话可以打开《arduino程序设计基础》书本了解一下。

二.硬件连接
本例子设定arduino UNO的 D10,D11针口为软串口;D8接了LED灯;
开发板:ESP8266模块                                                      arduino UNO                       LED灯
                 RT   -----------------------------------------------   D11
                TX   ------------------------------------------------   D10
              GND  -----------------------------------------------  GND  -----------------  GND
               VCC (这处本人独立供电,没接UNO)-----------      3.3
                                                                                                D8  ---------------------   +

三.blinker APP设置
本人比较懒,核对了一下跟这位朋友的一样,大家可以参照以下朋友的设置,借用一下
《[分享] 点灯·blinker-1物联网初次尝试-Arduino物联网控制LED灯-零基础篇》
点灯·blinker-1物联网初次尝试-Arduino物联网控制LED灯-零基础篇
https://www.arduino.cn/thread-94081-1-1.html
(出处: Arduino中文社区)

文中《2.3 Arduino程序》之前(不含2.3 Arduino程序)参照设置就行了

四.ESP8266代码解释
应用了软件例子来修改处,可能有多余的语句


[pre]#define BLINKER_WIFI

#include <Blinker.h>

char auth[] = "      ";// 软件密钥
char ssid[] = "wifiToyTest";// 需连接WIFI的名字
char pswd[] = "20150409";// 需连接WIFI的密码

// 新建组件对象
BlinkerButton Button1("btn-abc");


// 按下按键即会执行该函数
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    if (state=="on") {
      // 控制8266上的灯为关,可删除该语句
        digitalWrite(LED_BUILTIN, LOW);
        // 反馈开关状态
        Button1.print("on");
        // 向打印串口打印ON8的命令代码,传送给UNO
       Serial.println("ON8");
    } else if(state=="off"){
      // 控制8266上的灯为开,可删除该语句
        digitalWrite(LED_BUILTIN, HIGH);
        // 反馈开关状态
        Button1.print("off");
        // 向打印串口打印ON8的命令代码,传送给UNO
        Serial.println("OFF8");
  
    }
}



void setup()
{
    // 初始化串口
    Serial.begin(115200);
   
    // 初始化有LED的IO,控制8266上的灯,可删除该语句
    pinMode(LED_BUILTIN, OUTPUT);
    //控制8266上的灯为开,可删除该语句
    digitalWrite(LED_BUILTIN, HIGH);
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
   

    Button1.attach(button1_callback);
   
}

void loop() {
    Blinker.run();
}[/pre]

五.arduino UNO 代码解释

[pre]#include<SoftwareSerial.h>      //应用软串口代码库
SoftwareSerial softSerial(10,11); //设定UNO的软串口10 is RX  11 is tx  


void setup()
{
  // UNO的硬串口波特率
  Serial.begin(9600);
  // UNO的软串口波特率
  softSerial.begin(115200);
  // UNO的软串口启用监听
  softSerial.listen();
  // UNO的设定D8针口,接LED
  pinMode(8,OUTPUT);
}

int i;   //分析8266发来命令,储存命令中针口号码
String device_B_String = "";//通过电脑控制UNO串口输入信息,通过软串口传给8266端,本例子暂不需使用,可以删除
String device_A_String = "";//分析8266发来命令,储存命令中字符串,包括针口号码
String device_C_String = "";//分析8266发来命令,储存命令中字符串,不包括针口号码
String ON_String = "ON";//开状态校对值,暂不使用,可以删除
String OFF_String = "OFF";//关状态校对值,可以删除
boolean stringComplete = false; //用于判断8266发来的命令是否发送结束


void loop() {
  // 用于预留UNO发送信息给8266的代码,该段落可以删除,不删除也不影响
   if (Serial.available()>0)
   {
    if (Serial.peek()!='\n')
    {
      device_B_String += (char)Serial.read();
    }
    else
    {
      Serial.read();
      Serial.print("you said:");
      Serial.println(device_B_String);
      softSerial.println(device_B_String);
      device_B_String = "";
    }
  }

  
  // 分析8266通过D10,D11软串口发来UNO命令的处理
while(softSerial.available()){       //如果8266通过D10,D11软串口发来命令
  char inChar = softSerial.read();        //定义inchar字符为软串口的字符
  if(isDigit(inChar)){             //如果inchar字符为数字就逐个储存在device_A_String
    device_A_String += inChar;
  }
  else if (inChar =='\n'){         //如果软串口发来命令结束
    i = device_A_String.toInt();   //i等于device_A_String里面的数字部分
    Serial.print("device_A_String:");//UNO通过硬串口打印出device_A_String的内容显示在电脑,用于调试
    Serial.println(device_A_String);
    Serial.print("i:");              //UNO通过硬串口打印出i的内容显示在电脑,用于调试
    Serial.println(i);
    Serial.print("device_C_String:"); //UNO通过硬串口打印出device_C_String的内容显示在电脑,用于调试
    Serial.println(device_C_String);
    stringComplete = true;         //设定8266发来命令已经完毕
  }
  else device_C_String += inChar;  //如果8266发来命令不是数字的话,就逐个字符储存在device_C_String
        
}


  if(stringComplete){              //如果8266发来命令已经完毕
    if(device_C_String.startsWith("ON")){  //判断device_C_String字符串以ON开头的话,i端口为高电平,并通过硬串口打印出结果
    digitalWrite(i,HIGH);
    Serial.println("LEDON");
    }
  else if(device_C_String.startsWith("OFF")){ //判断device_C_String字符串以OFF开头的话,i端口为高电平,并通过硬串口打印出结果
      digitalWrite(i,LOW);
  Serial.println("LEDOFF");
    }
    stringComplete = false;        //设定8266没有发来命令     
     device_A_String = "";    //清空该值,释放储存
     device_C_String = "";    //清空该值,释放储存
     
    }
    }[/pre]

通过以上实现通过blinker开关按钮控制arduino UNO板D8针口的状态,其中8266通过给UNO发送“ON8”命令代表8针口高电平,发送“OFF8”命令代表8针口低电平。不明之处可交流,谢谢。解释中可以删除的代码不删除也不影响运转。

六 .    另外,  以下为个人的疑问,望大神们解答,为何我修改最后一段代码为以下几种都功能无法实现??????,是有空格符?

[pre]if(stringComplete){              //如果8266发来命令已经完毕
    if(device_C_String=="ON"){  //判断device_C_String字符串以ON开头的话,i端口为高电平,并通过硬串口打印出结果
    digitalWrite(i,HIGH);
    Serial.println("LEDON");
    }
  else if(device_C_String=="OFF"){ //判断device_C_String字符串以OFF开头的话,i端口为高电平,并通过硬串口打印出结果
      digitalWrite(i,LOW);
  Serial.println("LEDOFF");
    }
    stringComplete = false;        //设定8266没有发来命令     
     device_A_String = "";    //清空该值,释放储存
     device_C_String = "";    //清空该值,释放储存
     
    }
    }[/pre]

另外

[pre]if(stringComplete){              //如果8266发来命令已经完毕
    if(device_C_String.compareTo(ON_String)==0){  //判断device_C_String字符串以ON开头的话,i端口为高电平,并通过硬串口打印出结果
    digitalWrite(i,HIGH);
    Serial.println("LEDON");
    }
  else if(device_C_String.compareTo(OFF_String)==0){ //判断device_C_String字符串以OFF开头的话,i端口为高电平,并通过硬串口打印出结果
      digitalWrite(i,LOW);
  Serial.println("LEDOFF");
    }
    stringComplete = false;        //设定8266没有发来命令     
     device_A_String = "";    //清空该值,释放储存
     device_C_String = "";    //清空该值,释放储存
     
    }[/pre]


求大神指导!!谢谢!!
发表于 2020-3-13 16:49 | 显示全部楼层
使用的时8266-01模块吗?需要拉高某个针脚吧
 楼主| 发表于 2020-3-14 12:18 | 显示全部楼层
模块和8266开发板都可以,上传程序按说明操作就可以了
 楼主| 发表于 2020-3-28 18:49 | 显示全部楼层
自捅一下希望有人答疑
发表于 2020-4-3 23:30 | 显示全部楼层
楼主好,想请教您一下,第四部分和第五部分的代码是分别下载到esp模块和uno模块,然后烧录成功后,再把两个模块接到一起工作吗?我理解的对吗?另外下载esp的代码时,esp需要和uno板子连接吗
发表于 2020-4-25 21:53 | 显示全部楼层

楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗?
发表于 2020-5-25 17:41 | 显示全部楼层
爱酱丶 发表于 2020-4-25 21:53
楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗? ...

不用分别烧录
发表于 2020-8-22 08:52 | 显示全部楼层
你用的软串口是esp8266的flash内部引脚,这样可以的吗?
发表于 2021-1-3 10:49 | 显示全部楼层
yondo 发表于 2020-4-3 23:30
楼主好,想请教您一下,第四部分和第五部分的代码是分别下载到esp模块和uno模块,然后烧录成功后,再把两个 ...

对的,连接方式参照正文的接线示意图
发表于 2021-1-3 10:53 | 显示全部楼层
爱酱丶 发表于 2020-4-25 21:53
楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗? ...

软件丶硬件分别设置好,重启就可以了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:33 , Processed in 0.121940 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表