Последовательная связь между 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 ответ
Arduino UNO имеет логику 5 В,а esp8266-логику 3,3 В. Вам нужен переключатель уровней, чтобы они могли иметь двунаправленную последовательную связь.
Это было бы предпочтительным, но arduino более чем способен обрабатывать вход ESP8266, и, хотя это не идеально, esp предназначен для работы с напряжением до 5,1 вольт. Полный шифтер - это перебор. Поэтому, если вы расширите свое сообщение, чтобы показать простой резистивный делитель для защиты nodemcu, сбросив напряжение сообщения от arduino tx к nodemcu RX, ваша заметка (а не ответ) может оказаться полезной., @Tomas
- SIM800L не отвечает на AT-команды
- Проблема последовательной связи с общей землей SIM800L
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- Как связаться с GPS SIM900a без serial monitor
- Как читать и анализировать данные UART с радарного датчика присутствия человека
- Связь UART - серийный номер всегда пуст
- Получение мусорных значений при отправке объекта Json из Arduino Uno в NodeMCU с использованием SoftwareSerial
- Последовательная связь, если инструкция не работает
Вы не описали, что на самом деле происходит, просто это не работает. Пожалуйста, добавьте это описание к вашему вопросу. На первый взгляд я вижу, что вы посылаете до каждой половины секунды, в то время как вы получаете только один раз в секунду, так как вы задерживаете на 1с. Почему ты вообще там задерживаешься? Это не соответствует никакой цели, @chrisl
Я согласен с @chrisl, не используйте задержку, плохая практика, поиск "Arduino millis delay" - это лучший способ. И почему вы передаете значение без тега, когда я выполнял подобные задачи, я использовал формат передачи типа"<type>,<value>", например "скорость, 200"., @Mats Karlsson
И чтобы избежать неприятностей, создайте простую программу ПОЦЕЛУЯ, чтобы вы узнали, как сделать передачу по сериалу, прежде чем делать более сложную программу., @Mats Karlsson
Удалите данные AIO из скетча., @Tomas
дайте нам пример данных и что дополнительно. Я, например, заметил, что вы используете println, поэтому после каждого сообщения вы получаете символ новой строки. (дополнительные данные в конце). Хотя NODEMCU отправляет некоторые данные в последовательный порт при каждом запуске. Также не забывайте о разнице между числом и символами чисел. print отправляет числа как их символы, а "write" отправляет числа как числа, @Tomas