Одновременное прикрепление взаимоисключающих библиотек
- Войдите на сайт для отправки комментариев
Пт, 10/04/2020 - 17:49
Чип ESP8266. На основную работающую программу залил сверху еще одну дополнительную. То есть подсоединил еще две библиотеки и в код вставил нужные строчки. Скетч скомпилировался и загрузился в чип. Но устройство не работает в итоге.
Может быть такое, что некоторые библиотеки "не дружат" друг с другом? То есть какой-то аппаратный конфликт, который не видит компилятор. Может такое быть?
может, если например два библиотеки хотят обратится к одну и тому же ресурсу и их авторы не подумали о совместной работе
Запросто. И это будет такой "гнусный" глюк.
Понятно, спасибо. У меня такая догадка и была.
И что делать с этим "гнусным" глюком? Под вторую программу еще одну ESP-шку докупать? И делать отдельно второе устройство?
И что делать с этим "гнусным" глюком? Под вторую программу еще одну ESP-шку докупать? И делать отдельно второе устройство?
Вам сказали только, что конфликт библиотек возможен, а не то, что он у Вас есть. Не допускаете возможность, что просто накосячили в коде, вот он и не работает? Без кода, ссылок на используемые библиотеки и описания конкретной проблемы - это разговор ни о чём.
Коды работают и на одном чипе и на другом в отдельности. А вместе на одном чипе не хотят.
#include <ESP8266WiFi.h> #include <Pinger.h> #include <PingerResponse.h> #include <ESP8266Ping.h> #include <LiquidCrystal.h> // Подключаем библиотеки //#include <ArduinoJson.h> //#include <Wire.h> const int rs = 16, en = 12, d4 = 13, d5 = 0, d6 = 2, d7 = 14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // Настройки доступа WiFi const char* ssid = "X"; / спрятал const char* password = "X"; / аналогично // Адрес API const char* host = "api.coindesk.com"; const char* remote_host = "192.168.0.130"; int ledPin = 8; void setup() { pinMode(ledPin, OUTPUT); lcd.begin(16, 2); // Инициализируем последовательный порт Serial.begin(115200); // Подключаемся к сети WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { lcd.begin(16, 2); // Подключаемся к серверу Serial.print("connecting to "); Serial.println(host); // Используем WiFiClient для создания TCP соединения WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // Формируем запрос String url = "/v1/bpi/currentprice.json"; Serial.print("Requesting URL: "); Serial.println(url); // Отправляем запрос на сервер client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(100); // Читаем ответ сервера и выводим в терминал String answer; while (!client.available()) {} // ждем ответ сервера while (client.available()) { String line = client.readStringUntil('\r'); answer += line; } client.stop(); Serial.println(); Serial.println("closing connection"); // обрабатываем ответ Serial.println(); Serial.println("Answer: "); Serial.println(answer); // конвертируем в JSON String jsonAnswer; int jsonIndex; for (int i = 0; i < answer.length(); i++) { if (answer[i] == '{') { jsonIndex = i; break; } } // извлекаем данные JSON jsonAnswer = answer.substring(jsonIndex); Serial.println(); Serial.println("JSON answer: "); Serial.println(jsonAnswer); jsonAnswer.trim(); // конвертируем курс в число с плавающей запятой int rateIndex = jsonAnswer.indexOf("rate_float"); String priceString = jsonAnswer.substring(rateIndex + 12, rateIndex + 18); priceString.trim(); float price = priceString.toFloat(); // выводим курс в терминал Serial.println(); Serial.println(price); lcd.setCursor(0,0); lcd.print("Bitcoin price: "); price = (price * 0.92); // отображаем курс на дисплее lcd.setCursor (0,1); lcd.print(price); lcd.setCursor (8,1); lcd.print ("EUR"); Serial.println(); Serial.print("WiFi connected with ip "); Serial.println(WiFi.localIP()); Serial.print("Pinging host "); Serial.println(remote_host); if(Ping.ping(remote_host)) { Serial.println("Success!!"); digitalWrite (ledPin, LOW); } else { Serial.println("Error :("); digitalWrite (ledPin, HIGH); // ждем 5 секунд delay(5000); }}Прога должна отображать время с атомных часов, курс биткоина раз в 10 секунд и пинговать локальный IP. Если локальный ай-пи не пингуется - то загорается светодиод. Вот пинг локального устройства у меня и нарушил работу устройства.
Коды по отдельности:
Это работа с временем и биткоином, работает:
#include <LiquidCrystal.h> #include <NTPClient.h> // Подключаем библиотеки #include <ESP8266WiFi.h> //#include <ArduinoJson.h> #include <Wire.h> #include <WiFiUdp.h> const int rs = 16, en = 12, d4 = 13, d5 = 0, d6 = 2, d7 = 14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // Настройки доступа WiFi const char* ssid = "X"; const char* password = "X"; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "ntp.cert.lv", 3600, 60000); // Адрес API const char* host = "api.coindesk.com"; void setup() { lcd.begin(16, 2); // Инициализируем последовательный порт Serial.begin(115200); // Подключаемся к сети WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); timeClient.begin(); } void loop() { lcd.begin(16, 2); int timezone; int minutes; int sec; timeClient.update(); timezone = (timeClient.getHours()+2); // timezone = (1 + 2); // only for testing if (timezone == 24) {timezone = 0;}; if (timezone == 25) {timezone = 1;}; lcd.setCursor (1,0); lcd.print ("Time:"); if (timezone < 10) {lcd.print (" ");}; lcd.setCursor (7,0); lcd.print (timezone); // lcd.setCursor (8,0); lcd.print (":"); minutes = (timeClient.getMinutes()); // lcd.setCursor (9,0); if (minutes < 10) {lcd.print ("0");}; lcd.print (minutes); // lcd.print (":"); // sec = (timeClient.getSeconds()); // lcd.setCursor (7,0); // if (sec < 10) {lcd.print ("0");}; // lcd.print (sec); // Подключаемся к серверу Serial.print("connecting to "); Serial.println(host); // Используем WiFiClient для создания TCP соединения WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // Формируем запрос String url = "/v1/bpi/currentprice.json"; Serial.print("Requesting URL: "); Serial.println(url); // Отправляем запрос на сервер client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(100); // lcd.print ("Bitcoin price:"); // Читаем ответ сервера и выводим в терминал String answer; while (!client.available()) {} // ждем ответ сервера while (client.available()) { String line = client.readStringUntil('\r'); answer += line; } client.stop(); Serial.println(); Serial.println("closing connection"); // обрабатываем ответ Serial.println(); Serial.println("Answer: "); Serial.println(answer); // конвертируем в JSON String jsonAnswer; int jsonIndex; for (int i = 0; i < answer.length(); i++) { if (answer[i] == '{') { jsonIndex = i; break; } } // извлекаем данные JSON jsonAnswer = answer.substring(jsonIndex); Serial.println(); Serial.println("JSON answer: "); Serial.println(jsonAnswer); jsonAnswer.trim(); // конвертируем курс в число с плавающей запятой int rateIndex = jsonAnswer.indexOf("rate_float"); String priceString = jsonAnswer.substring(rateIndex + 12, rateIndex + 18); priceString.trim(); float price = priceString.toFloat(); // выводим курс в терминал Serial.println(); Serial.println(price); lcd.setCursor(0,0); lcd.print("Bitcoin price: "); price = (price * 0.92); // отображаем курс на дисплее lcd.setCursor (0,1); lcd.print(price); lcd.setCursor (8,1); lcd.print ("EUR"); // ждем 5 секунд delay(10000); }Это отдельно работающая прога на второй esp-шке пинга устройства:
* * This example show how to ping a remote machine using it's hostname */ #include <ESP8266WiFi.h> #include <ESP8266Ping.h> const char* ssid = "X"; const char* password = "X"; const char* remote_host = "192.168.0.130"; int ledPin = 8; void setup() { Serial.begin(115200); delay(10); pinMode(ledPin, OUTPUT); // We start by connecting to a WiFi network Serial.println(); Serial.println("Connecting to WiFi"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print("."); } } void loop() { Serial.println(); Serial.print("WiFi connected with ip "); Serial.println(WiFi.localIP()); Serial.print("Pinging host "); Serial.println(remote_host); if(Ping.ping(remote_host)) { Serial.println("Success!!"); digitalWrite (ledPin, LOW); } else { Serial.println("Error :("); digitalWrite (ledPin, HIGH); } delay (1000); }У вас обе библиотеки - верхнего уровня работы с сетевыми протоколами. Вероятность. что в них есть какая-то несовместимость - 1%. а 99% - что вы просто написали кривой код.
Это называется не "несовместимость библиотек", а "помогите обьединить два скетча. по отдельности работают, а вместе нет". Такие вопросы тут пробегают почти ежедневно...
Оказывается нумерация выводов печатной платы LOL1n не совпадает с нумерацией выводов процессора ESP8266. В этом была моя ошибка, не проверил соответствие выводов. Вместо определения вывода
intledPin = 8; надо было написатьintledPin = 15;А скетчи я объединил правильно. Сейчас всё заработало. На всякий случай прикрепляю нумерацию выводов для этой платы:Как я так лоханулся??? Я же дисплей подключал в соответствии с этой картинкой. И забыл про это.