помогите "подружить" 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 у Вас одинарные кавычки. Так записывается одиночный символ, а Вы пытаетесь так записать строку. Я понимаю, что когда были двойные - у Вас компилятор ругался, но Вы не исправили ошибку, а только заткнули ему рот. Там двойные, разумеется, должны быть.
наверное надо как строку смотреть?
if (val == "test/led => 1") { digitalWrite(led1, HIGH); }наверное надо как строку смотреть?
if (val == "test/led => 1") { digitalWrite(led1, HIGH); }А заодно и сравнивать не так. Да и val - это char. Там много всего :)
Всем спасибо, у меня огромная просьба, если кто хорошо разбирается и не очень лень, накидайте на досуге как надо, а то я совсем зеленый еще, уже 3 дня сижу с этим кодом, всю голову сломал
По поводу кавычек, я и те и те ставил, не меняет сути дела
Меняет, просто это не единственная ошибка, потому проблемы не решило. Строки пишутся в двойных кавычках, а одиночные символы в одинарных. Напишите строки правильно и больше не дёргайте это. Одной ошибкой меньше будет.
Писать за Вас не буду, но направление дам.
1. Вы читаете в 17 строке один символ, а Вам надо вычитать все символы строки, прежде, чем сравнивать.
2. Даже если Вы вычитали строку, так просто операцией == строки не сравниваются. Сравнивать их надо функцией strcmp.
Про работу со строками много примеров у Кернигана и Ритчи.
Спасибо большое, вечером буду пробовать)
Это к Евгению Петровичу, мне знакомы общие принципы, а ему все частности )))
))))
//// удалил
Меняет, просто это не единственная ошибка, потому проблемы не решило. Строки пишутся в двойных кавычках, а одиночные символы в одинарных. Напишите строки правильно и больше не дёргайте это. Одной ошибкой меньше будет.
Писать за Вас не буду, но направление дам.
1. Вы читаете в 17 строке один символ, а Вам надо вычитать все символы строки, прежде, чем сравнивать.
2. Даже если Вы вычитали строку, так просто операцией == строки не сравниваются. Сравнивать их надо функцией strcmp.
Про работу со строками много примеров у Кернигана и Ритчи.
Почему строки не сравниваются операцией ==? Сколько скетчей писал со сравнением строк проблем не было. Все работает. Прошу пояснить. Очень уж любопытно стало.
Тогда, мб вы подскажете, почему не сравниваются они в моем случае?
Это в какой строке программы?
Скетч для ардуино, 19 стр, например (за исключением того, что там кавычки быть должны) там сравнение у меня, но ничего не происходит
if (val == test/led => 1) {Если вы про эту строку, то тут ничего и не произойдет. Потому что тут вообще полная чушь написана. И кто вам сказал что переменная типа char - это строка?
А вот так например все прекрасно работает:
string comm;
if (comm == "stop")