помогите "подружить" ESP и arduino
- Войдите на сайт для отправки комментариев
Чт, 12/01/2017 - 12:44
Здравствуйте, вопрос следующий. ESP соединена с arduino по RX-TX. На ESP команды приходят через mqtt сервер с телефона, все прекрасно работает, но мне не хватает его мощности, решил подключить к ардуино, так вот, команды на ардуино, вроде как приходят, в порту они отображаются, но почему то он их не исполняет, мб чего не так делаю? спасибо
P.S на скрине монитор с ардуины выведен, то есть на нее команда приходит.
P.S.S -127.00 на скрине это показания температуры(датчик не подключен.
вот скетч esp:
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); const char *ssid = "TP-LINK_39EE"; // Имя вайфай точки доступа const char *pass = ""; // Пароль от точки доступа const char *mqtt_server = "888888"; // Имя сервера MQTT const int mqtt_port = 88888; // Порт для подключения к серверу MQTT const char *mqtt_user = "orpolcka"; // Логи от сервер const char *mqtt_pass = "8888"; // Пароль от сервера #define BUFFER_SIZE 100 bool LedState = false; int tm=300; float temp=0; // Функция получения данных от сервера void callback(const MQTT::Publish& pub) { Serial.print(pub.topic()); // выводим в сериал порт название топика Serial.print(" => "); Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных String payload = pub.payload_string(); if(String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные { int stled = payload.toInt(); // преобразуем полученные данные в тип integer digitalWrite(0,stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных } } WiFiClient wclient; PubSubClient client(wclient, mqtt_server, mqtt_port); void setup() { sensors.begin(); Serial.begin(115200); delay(10); Serial.println(); Serial.println(); pinMode(0, OUTPUT); } void loop() { // подключаемся к wi-fi if (WiFi.status() != WL_CONNECTED) { Serial.print("Connecting to "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi connected"); } // подключаемся к MQTT серверу if (WiFi.status() == WL_CONNECTED) { if (!client.connected()) { Serial.println("Connecting to MQTT server"); if (client.connect(MQTT::Connect("arduinoClient2") .set_auth(mqtt_user, mqtt_pass))) { Serial.println("Connected to MQTT server"); client.set_callback(callback); client.subscribe("test/led"); // подписывааемся по топик с данными для светодиода } else { Serial.println("Could not connect to MQTT server"); } } if (client.connected()){ client.loop(); } } } // конец основного цикла // Функция отправки показаний с термодатчика
вот скетч ардуино:
int led1 = 13; int led2 = 8; char val; void setup() { Serial.begin(115200); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); } void loop() { if (Serial.available()) { val = Serial.read(); Serial.print(val); if (val == test/led => 1) { digitalWrite(led1, HIGH); } if(val == '-127.00'){ digitalWrite(led2, HIGH); } if (val == 'r') { digitalWrite(led2, LOW); } if (val == 'test/led => 0') { digitalWrite(led1, LOW); } } }
А нельзя ли вывод тоже печатать нормально? Ну, не видно ж ни хрена на картинках.
Кто у Вас чего не исполняет? ESP шлёт ардуине команды, а она их не исполняет? Или как?
За картинку извиняюсь, если это принципиально, вечером попробую сделать картинку больше. Есп шлёт команду на ардуину,она ее вроде как принимает и даже в сериал монитор выводит, но не исполняет
Да не надо картинку больше, просто текст и монитора копипастите сюда обычным текстом.
А по сути. У Вас val - описан как символ. И читаете Вы его в строке 17 как одиночный символ. А с чем Вы его сравниваете в строках 19, 22, 28?
Если Вы хотите сравнивать со строкой, так сначала вычитывайте строку, а потом сравнивайте. А то Вы прочитали один символ, сравнили со строкой, прочитали второй опять сравнили и т.д.
Кстати, в строках 22 и 28 у Вас одинарные кавычки. Так записывается одиночный символ, а Вы пытаетесь так записать строку. Я понимаю, что когда были двойные - у Вас компилятор ругался, но Вы не исправили ошибку, а только заткнули ему рот. Там двойные, разумеется, должны быть.
наверное надо как строку смотреть?
наверное надо как строку смотреть?
А заодно и сравнивать не так. Да и val - это char. Там много всего :)
Всем спасибо, у меня огромная просьба, если кто хорошо разбирается и не очень лень, накидайте на досуге как надо, а то я совсем зеленый еще, уже 3 дня сижу с этим кодом, всю голову сломал
По поводу кавычек, я и те и те ставил, не меняет сути дела
Меняет, просто это не единственная ошибка, потому проблемы не решило. Строки пишутся в двойных кавычках, а одиночные символы в одинарных. Напишите строки правильно и больше не дёргайте это. Одной ошибкой меньше будет.
Писать за Вас не буду, но направление дам.
1. Вы читаете в 17 строке один символ, а Вам надо вычитать все символы строки, прежде, чем сравнивать.
2. Даже если Вы вычитали строку, так просто операцией == строки не сравниваются. Сравнивать их надо функцией strcmp.
Про работу со строками много примеров у Кернигана и Ритчи.
Спасибо большое, вечером буду пробовать)
Это к Евгению Петровичу, мне знакомы общие принципы, а ему все частности )))
))))
//// удалил
Меняет, просто это не единственная ошибка, потому проблемы не решило. Строки пишутся в двойных кавычках, а одиночные символы в одинарных. Напишите строки правильно и больше не дёргайте это. Одной ошибкой меньше будет.
Писать за Вас не буду, но направление дам.
1. Вы читаете в 17 строке один символ, а Вам надо вычитать все символы строки, прежде, чем сравнивать.
2. Даже если Вы вычитали строку, так просто операцией == строки не сравниваются. Сравнивать их надо функцией strcmp.
Про работу со строками много примеров у Кернигана и Ритчи.
Почему строки не сравниваются операцией ==? Сколько скетчей писал со сравнением строк проблем не было. Все работает. Прошу пояснить. Очень уж любопытно стало.
Тогда, мб вы подскажете, почему не сравниваются они в моем случае?
Это в какой строке программы?
Скетч для ардуино, 19 стр, например (за исключением того, что там кавычки быть должны) там сравнение у меня, но ничего не происходит
Если вы про эту строку, то тут ничего и не произойдет. Потому что тут вообще полная чушь написана. И кто вам сказал что переменная типа char - это строка?
А вот так например все прекрасно работает:
string comm;
if (comm == "stop")