Последовательная связь между nodemcu и Arduino Uno

В последние дни я пытаюсь установить последовательную связь между nodemcu и Arduino Uno, но мне это не удалось. В настоящее время я работаю над проектом домашней автоматизации. Я получаю данные от nodemcu и отправляю их в Arduino Uno, но некоторые фиктивные данные также получают с оригинальными данными. Пожалуйста, помогите.

Код Nodemcu:

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define Automated   D0
#define Led         D1
#define Fan         D2

#define WLAN_SSID       "JioFi2_1EAFF8"
#define WLAN_PASS       "Ode9c@,1S%31ja$1xANkeL"

#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "_inishu"
#define AIO_KEY        "aio_HZUG00TupkcsC2dvraQM7HLHrCd4"

WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Subscribe speed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/Fan"); 
Adafruit_MQTT_Subscribe inten = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/Led");
Adafruit_MQTT_Subscribe autom = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/Automate");

void MQTT_connect();
void datatransfer(int);


int on_off;
int sliderval1;
int sliderval2;
void setup(){
    Serial.begin(9600);
    pinMode(Automated, OUTPUT);
    pinMode(Led, OUTPUT);
    pinMode(Fan, OUTPUT);

    WiFi.begin(WLAN_SSID, WLAN_PASS);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
    }

    mqtt.subscribe(&autom);
    mqtt.subscribe(&speed);
    mqtt.subscribe(&inten);
}


void loop (){
    MQTT_connect();

    Adafruit_MQTT_Subscribe *subscription;
    while ((subscription = mqtt.readSubscription(5000))){
        if (subscription == &autom){
            on_off = atoi((char *)autom.lastread);
            if (on_off == 1)   digitalWrite(Automated,HIGH);
            if (on_off == 0)   digitalWrite(Automated,LOW);
        }
        
        if (subscription == &speed){
            sliderval1 = atoi((char *)speed.lastread);
            analogWrite(Fan, sliderval1);
        }

        if (subscription == &inten){
            sliderval2 = atoi((char *)inten.lastread);
            analogWrite(Led, sliderval2);
        }
    }
    datatransfer(on_off);
    datatransfer(sliderval1);
    datatransfer(sliderval2);
}


void MQTT_connect() {
    if (mqtt.connected()) {
         return;
    }
  
    while (mqtt.connect() != 0) {
        mqtt.disconnect();
        delay(2000);  
    }
}

void datatransfer(int value){
    Serial.println(value);
    delay(500);
} 

Код Arduino Uno:

int x = A0, y = A1, z = 1;
int fan = 11, led = 10;
float temp, lux;
int autom = 1;
int inten = 0;
int speed = 0;
int fanspeed, light;

int datareceive(){
    int receiver = 0;
    while(Serial.available()==0 );
    String s = Serial.readStringUntil('\r');
    receiver = s.toInt();
    Serial.println(receiver);
    delay(1000);
    return receiver;
}
 
void setup(){
    Serial.begin(9600);
    pinMode(fan,OUTPUT);
    pinMode(led,OUTPUT);
    pinMode(x,INPUT);
    pinMode(y,INPUT);
    pinMode(z,INPUT);
}
 
void loop(){
    autom = datareceive();
    speed = datareceive();
    inten = datareceive();
    if(autom == 1){
        fanspeed = 255 - speed;
        light = 255 - inten;
        analogWrite(fan,fanspeed);
        analogWrite(led,light);
    }  
    else {
        temp = analogRead(x);
        if (temp >= 52 && temp <= 104){
            int fanspeed = -4.90384615*temp + 510;
            analogWrite(fan, fanspeed);
        }
        else if(temp > 104)  digitalWrite(fan,LOW);
        else digitalWrite(fan,HIGH);
        lux = analogRead(y);
        if (lux >= 430 && lux <= 594){
            int light = 1.342657*lux-577.342657;
            analogWrite(led,light);
        }
        else if (lux < 430) digitalWrite(led, LOW);
        else digitalWrite(led,HIGH);
    }
}

, 👍1

Обсуждение

Вы не описали, что на самом деле происходит, просто это не работает. Пожалуйста, добавьте это описание к вашему вопросу. На первый взгляд я вижу, что вы посылаете до каждой половины секунды, в то время как вы получаете только один раз в секунду, так как вы задерживаете на 1с. Почему ты вообще там задерживаешься? Это не соответствует никакой цели, @chrisl

Я согласен с @chrisl, не используйте задержку, плохая практика, поиск "Arduino millis delay" - это лучший способ. И почему вы передаете значение без тега, когда я выполнял подобные задачи, я использовал формат передачи типа"<type>,<value>", например "скорость, 200"., @Mats Karlsson

И чтобы избежать неприятностей, создайте простую программу ПОЦЕЛУЯ, чтобы вы узнали, как сделать передачу по сериалу, прежде чем делать более сложную программу., @Mats Karlsson

Удалите данные AIO из скетча., @Tomas

дайте нам пример данных и что дополнительно. Я, например, заметил, что вы используете println, поэтому после каждого сообщения вы получаете символ новой строки. (дополнительные данные в конце). Хотя NODEMCU отправляет некоторые данные в последовательный порт при каждом запуске. Также не забывайте о разнице между числом и символами чисел. print отправляет числа как их символы, а "write" отправляет числа как числа, @Tomas


1 ответ


1

Arduino UNO имеет логику 5 В,а esp8266-логику 3,3 В. Вам нужен переключатель уровней, чтобы они могли иметь двунаправленную последовательную связь.

,

Это было бы предпочтительным, но arduino более чем способен обрабатывать вход ESP8266, и, хотя это не идеально, esp предназначен для работы с напряжением до 5,1 вольт. Полный шифтер - это перебор. Поэтому, если вы расширите свое сообщение, чтобы показать простой резистивный делитель для защиты nodemcu, сбросив напряжение сообщения от arduino tx к nodemcu RX, ваша заметка (а не ответ) может оказаться полезной., @Tomas