esp8266+nano软串口通讯(解决引脚不够用的问题)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15679|回复: 19

[分享] esp8266+nano软串口通讯(解决引脚不够用的问题)

[复制链接]
发表于 2019-4-20 18:18 | 显示全部楼层 |阅读模式
本帖最后由 新手之帆 于 2020-1-19 20:15 编辑

注:连线要接对。TX-RX RX-TX
程序里关于软串口的定义是这样的:
SoftwareSerial SerialA(RX,TX);
可能很多问题就是接线不正确!
esp8266才8个GPIO,1个ADC,实在有点少。所以,采用软串口,就可以解决引脚不够用的问题

而为什么要使用软串口,而不用硬串口呢?这并不是说硬串口不能用,而是硬串口的8266在连接blinker是会发送很多调试信息,而nano获取这些信息需要大量时间,阻塞了程序,所以就采用了软串口。
还有一点,就是线拔来拔去太麻烦。

思路大概就是:blinker端按下按键,esp8266收到,再软串口发送特定指令如("LED ON"),NANO端收到(“LED ON”)就执行某个指令。这也是很多使用blinker的人们想要实现的,或因为io太少了,或者是以前的项目要接入物联网,但太麻烦,硬件改来改去,甚至换开发板。

esp8266端代码
#define BLINKER_WIFI

#include <Blinker.h>
#include<SoftwareSerial.h>
SoftwareSerial mySerial(13,15);
char auth[] = "/*你的MQTT密钥*/";
char ssid[] = "/*wifi名字*/";
char pswd[] = "/*wifi密码*/";

#define BUTTON_1 "ButtonKey"

BlinkerButton Button1(BUTTON_1);

void button1_callback(const String & state)
{
if (state == BLINKER_CMD_ON) {
        BLINKER_LOG("Toggle on!");

        Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("Your button name or describe");
        // Button1.text("Your button name", "describe");
        Button1.print("on");
        mySerial.print("Turn on LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
    }
    else if (state == BLINKER_CMD_OFF) {
        BLINKER_LOG("Toggle off!");

        Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("Your button name or describe");
        // Button1.text("Your button name", "describe");
        Button1.print("off");
        mySerial.print("Turn off LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
    }
}

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

    Blinker.vibrate();

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

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    mySerial.begin(115200);
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    Button1.attach(button1_callback);
}

void loop()
{
    Blinker.run();
}


其实就是在例程上做了一些改动。

nano端代码
//Nano与esp8266的通讯实验
#include<SoftwareSerial.h>
SoftwareSerial mySerial(5,6);
String Serial_String="";
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
mySerial.begin(115200);
pinMode(LED_BUILTIN,OUTPUT);
}
void read_string(){
  while(mySerial.available()>0){
  Serial_String+=(char)(mySerial.read());
  delay(2);}
}
void loop() {
  // put your main code here, to run repeatedly:
  if(mySerial.available()>0){
    Serial_String="";
    read_string();
  }
   Serial.println(Serial_String);

   if(Serial_String=="Turn on LED")digitalWrite(LED_BUILTIN,1);
    else if(Serial_String=="Turn off LED")digitalWrite(LED_BUILTIN,0);
}

注:SoftwareSerial库arduino自带,blinker库在github上搜索arduino-library就可以找到。

视频演示:
待到B站审核过时,我再发。


制作不易,打赏一下我明天杯饮料?
发表于 2019-4-27 12:00 | 显示全部楼层
方法不错,我用UNO试试,视频在何处?
 楼主| 发表于 2019-4-27 16:50 | 显示全部楼层
nyx 发表于 2019-4-27 12:00
方法不错,我用UNO试试,视频在何处?

等有手机了再上传
发表于 2019-6-5 23:12 | 显示全部楼层
有传输数据的例程  和那个arduino传输数字  字符串到esp的例程嘛,也是用的blinker
 楼主| 发表于 2019-6-6 13:09 | 显示全部楼层
么么 发表于 2019-6-5 23:12
有传输数据的例程  和那个arduino传输数字  字符串到esp的例程嘛,也是用的blinker ...

可以自己写
发表于 2019-6-9 16:10 | 显示全部楼层

嗯嗯,就是我现在的是把那个您现在编的程序改写到arduino里面但是esp得不到反馈   还有就是发送数值的话是不是把那个定义  String  换成   float呢
 楼主| 发表于 2019-6-9 17:34 | 显示全部楼层
么么 发表于 2019-6-9 16:10
嗯嗯,就是我现在的是把那个您现在编的程序改写到arduino里面但是esp得不到反馈   还有就是发送数值的话 ...

具体你发一下代码吧
发表于 2019-6-9 21:36 | 显示全部楼层
新手之帆 发表于 2019-6-9 17:34
具体你发一下代码吧

//这是esp的
#define BLINKER_WIFI
#include <Blinker.h>
#include<SoftwareSerial.h>
SoftwareSerial mySerialA(D5,D6);

String Serial_String="";

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

BlinkerButton Button1("btn-gfq");

void button1_callback(const String & state)
{
if (state =="on") {
        BLINKER_LOG("Toggle on!");

        Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("开灯");
        // Button1.text("Your button name", "describe");
        Button1.print("on");
        mySerialA.print("Turn on LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
    }
    else if (state =="off") {
        BLINKER_LOG("Toggle off!");

        Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("关灯");
        // Button1.text("Your button name", "describe");
        Button1.print("off");
        mySerialA.print("Turn off LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
    }
}

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

    Blinker.vibrate();

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

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

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

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    Button1.attach(button1_callback);
}
void  read_string(){
   if(mySerialA.available()>0){
   Serial_String+=(char)(mySerialA.read());
   delay(2);}
     }

void loop()
{
    Blinker.run();
    if(mySerialA.available()>0){
    Serial_String="";
    read_string();
           }

   if(Serial_String=="turn off")     
     {BLINKER_LOG("Button1:","off");
      Button1.print("off");}
}

//这是arduino uno的
#include<SoftwareSerial.h>
SoftwareSerial mySerialA(5,6);

String Serial_String="";

int PIRpin=2;
int ledpin=12;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
mySerialA.begin(9600);
pinMode(LED_BUILTIN,OUTPUT);

pinMode(PIRpin,INPUT); //人体红外探测
pinMode(ledpin,OUTPUT);

attachInterrupt(0,warning,LOW);
}
void read_string(){
  while(mySerialA.available()>0){
  Serial_String+=(char)(mySerialA.read());
  delay(2);
  }
}
void loop() {
  // put your main code here, to run repeatedly:
  if(mySerialA.available()>0){
    Serial_String="";
    read_string();
  }
   Serial.println(Serial_String);
   if(Serial_String=="Turn on LED")
    {digitalWrite(LED_BUILTIN,HIGH);
    digitalWrite(12,HIGH);}
    else if(Serial_String=="Turn off LED")
     {digitalWrite(LED_BUILTIN,LOW);
     digitalWrite(12,LOW);
    }
}
//中断函数
void warning(){
  Serial.println("turn off");
  mySerialA.print("turn off");
  digitalWrite(12,LOW);
  }
 楼主| 发表于 2019-6-10 19:24 | 显示全部楼层
么么 发表于 2019-6-9 21:36
//这是esp的
#define BLINKER_WIFI
#include

可以说一下程序想要做什么吗
发表于 2019-6-10 22:20 | 显示全部楼层
新手之帆 发表于 2019-6-10 19:24
可以说一下程序想要做什么吗

就是先手机控制灯亮 , 红外感应到之后触发中断函数使得灯灭并将这反馈给esp引起blinker 按键处于关灯状态
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 08:40 , Processed in 0.122128 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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