Одновременное прикрепление взаимоисключающих библиотек

lc433
Offline
Зарегистрирован: 22.03.2020

Чип ESP8266. На основную работающую программу залил сверху еще одну дополнительную. То есть подсоединил еще две библиотеки и в код вставил нужные строчки. Скетч скомпилировался и загрузился в чип. Но устройство не работает в итоге.

Может быть такое, что некоторые библиотеки "не дружат" друг с другом? То есть какой-то аппаратный конфликт, который не видит компилятор. Может такое быть?

b707
Offline
Зарегистрирован: 26.05.2017

может, если например два библиотеки хотят обратится к одну и тому же ресурсу и их авторы не подумали о совместной работе

-NMi-
Offline
Зарегистрирован: 20.08.2018

Запросто. И это будет такой "гнусный" глюк.

lc433
Offline
Зарегистрирован: 22.03.2020

Понятно, спасибо. У меня такая догадка и была.

lc433
Offline
Зарегистрирован: 22.03.2020

И что делать с этим "гнусным" глюком? Под вторую программу еще одну ESP-шку докупать? И делать отдельно второе устройство?

kalapanga
Offline
Зарегистрирован: 23.10.2016

lc433 пишет:

И что делать с этим "гнусным" глюком? Под вторую программу еще одну ESP-шку докупать? И делать отдельно второе устройство?

Вам сказали только, что конфликт библиотек возможен, а не то, что он у Вас есть. Не допускаете возможность, что просто накосячили в коде, вот он и не работает? Без кода, ссылок на используемые библиотеки и описания конкретной проблемы - это разговор ни о чём.

lc433
Offline
Зарегистрирован: 22.03.2020

Коды работают и на одном чипе и на другом в отдельности. А вместе на одном чипе не хотят.

 

#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);
  
}}

 

lc433
Offline
Зарегистрирован: 22.03.2020

Прога должна отображать время с атомных часов, курс биткоина раз в 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);
  
}

 

lc433
Offline
Зарегистрирован: 22.03.2020

Это отдельно работающая прога на второй 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);
  
  
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

У вас обе библиотеки - верхнего уровня работы с сетевыми протоколами. Вероятность. что в них есть какая-то несовместимость - 1%. а 99% - что вы просто написали кривой код.

Это называется не "несовместимость библиотек", а "помогите обьединить два скетча. по отдельности работают, а вместе нет". Такие вопросы тут пробегают почти ежедневно...

lc433
Offline
Зарегистрирован: 22.03.2020

Оказывается нумерация выводов печатной платы LOL1n не совпадает с нумерацией выводов процессора ESP8266. В этом была моя ошибка, не проверил соответствие выводов. Вместо определения вывода  int ledPin = 8; надо было написать int ledPin = 15; А скетчи я объединил правильно. Сейчас всё заработало. На всякий случай прикрепляю нумерацию выводов для этой платы:

lc433
Offline
Зарегистрирован: 22.03.2020

Как я так лоханулся??? Я же дисплей подключал в соответствии с этой картинкой. И забыл про это.