Программа под ESP32 не компилируется, если включена опция показывать все предупреждения

Собственно вставал на эти грабли два раза. Сначала очень удивился когда программа скомпилировалась под УНО, а когда попробовал скомпилить тоже самое под stm32 получил ошибку. Сегодня с нуля компилировал под esp32. Сначала пару часов лазил по библиотекам в надежде понять где затык. Потом час по интернету, пока не набрёл на совет выключить вывод всех предупреждений компилятора. Скомпилировалось и заработало. Так что к совету включать вывод всех предупреждений компилятора надо подходить осторожно.

Что же “такого не такого” происходит при включении полного вывода?

ЗЫ: Было как-то постоянно сыпали предупреждения по ядру ардуино. Изменил #define (некоторые причем, не все) на const uint8_t и все стало без предупреждений… Чудеса ))

Попробуй сам.

Спойлер
#include <WiFi.h>
extern "C" {
  #include "freertos/FreeRTOS.h"
  #include "freertos/timers.h"
}
#include <AsyncMqttClient.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

Adafruit_BME280 bme; 

//replace with your network credentials
#define WIFI_SSID "YOUR_SSID"
#define WIFI_PASSWORD "YOUR_PASSWORD"

// Raspberry Pi Mosquitto MQTT Broker
#define MQTT_HOST IPAddress(192, 168, 1, 1)
#define MQTT_PORT 1883


//MQTT Topics
#define MQTT_PUB_TEMP "esp32/temperature"
#define MQTT_PUB_HUM  "esp32/humidity"
#define MQTT_PUB_PRES "esp32/pressure"

float temperature, humidity, pressure;

AsyncMqttClient mqttClient;
TimerHandle_t mqttReconnectTimer;
TimerHandle_t wifiReconnectTimer;

unsigned long previousMillis = 0;   
const long interval = 5000;        

void connectToWifi() {
  Serial.println("Connecting to Wi-Fi...");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}

void connectToMqtt() {
  Serial.println("Connecting to MQTT...");
  mqttClient.connect();
}

void WiFiEvent(WiFiEvent_t event) {
  Serial.printf("[WiFi-event] event: %d\n", event);
  switch(event) {
    case SYSTEM_EVENT_STA_GOT_IP:
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      connectToMqtt();
      break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
      Serial.println("WiFi lost connection");
      xTimerStop(mqttReconnectTimer, 0); 
      xTimerStart(wifiReconnectTimer, 0);
      break;
  }
}

void onMqttConnect(bool sessionPresent) {
  Serial.println("Connected to MQTT.");
  Serial.print("Session present: ");
  Serial.println(sessionPresent);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
  Serial.println("Disconnected from MQTT.");
  if (WiFi.isConnected()) {
    xTimerStart(mqttReconnectTimer, 0);
  }
}

void onMqttPublish(uint16_t packetId) {
  Serial.print("Publish acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}

void setup() {
  Serial.begin(115200);
  Serial.println();

   if (!bme.begin(0x76)) {
    Serial.println("Could not detect a BME280 sensor, Fix wiring connections!");
    while (1);
  }
  
  mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
  wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));

  WiFi.onEvent(WiFiEvent);

  mqttClient.onConnect(onMqttConnect);
  mqttClient.onDisconnect(onMqttDisconnect);
  mqttClient.onPublish(onMqttPublish);
  mqttClient.setServer(MQTT_HOST, MQTT_PORT);
  connectToWifi();
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    temperature = bme.readTemperature();
    humidity = bme.readHumidity();
    pressure = bme.readPressure() / 100.0F;
    
    
    // Publish an MQTT message on topic esp32/temperature
    uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temperature).c_str());                            
    Serial.printf("Publishing on topic %s at QoS 1, packetId: %i", MQTT_PUB_TEMP, packetIdPub1);
    Serial.printf("Message: %.2f \n", temperature);

    // Publish an MQTT message on topic esp32/humidity
    uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(humidity).c_str());                            
    Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_HUM, packetIdPub2);
    Serial.printf("Message: %.2f \n", humidity);

        // Publish an MQTT message on topic esp32/pressure
    uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pressure).c_str());                            
    Serial.printf("Publishing on topic %s at QoS 1, packetId: %i", MQTT_PUB_PRES, packetIdPub3);
    Serial.printf("Message: %.2f \n", pressure);
  }
}

IDE 2.3.2

По проще примера нет?
Лень это ставить:

fatal error: freertos/FreeRTOS.h: No such file or directory

как ты себе это представляешь, без списка понаставленных у тебя библиотек?
одних AsyncMqttClient вагон и маленькая тележка.

1 лайк

Это единственная не стандартная. На скорость не влияет. Бери любую, например https://github.com/marvinroger/async-mqtt-client/archive/master.zip

В составе 2.3.2 присутствует. Ставить не надо.

ну взял, давай дальше на до мной издевайся))

async-mqtt-client-master\src/AsyncMqttClient.hpp:13:10: fatal error: AsyncTCP.h: No such file or directory
 #include <AsyncTCP.h>
          ^~~~~~~~~~~~

поразительно!
без детализации

и с ней

Вот и у меня так же.

дак а default свичу не судьба прописАть?

2 лайка

гыы…
Дед, вот ты хакерюга!)
все завелось.

1 лайк

О чем вас ворнинги чесно пердуперждали…

Деда, вопрос к профи Delphi. Я Lazarus’ом пользовался, и помню в опциях компилятора была настройка, что типа забивать на полный контроль, типа как тут warningи, причём тоже по умолчанию включена. И вот, как я запилю, что нибудь сложное (для меня), так частенько во время работы крашилось всё. В процессе гугления, нашёл пару ответов, изменил настройки компилятора/сборки и сразу мне тоже куча ошибок в коде вылезло. Переделал, согласно мануалам, и всё стало работать хорошо, без вылетов.
Лет 15-20 назад это было, и вот сейчас не могу вспомнить, что это за хрень? Или приснилось мне это всё?

In the {$WARNINGS ON} state, the compiler issues warning messages when detecting uninitialized variables, missing function results, construction of abstract objects, and so on. In the {$WARNINGS OFF} state, the compiler generates no warning messages.

By placing code between {$WARNINGS OFF} and {$WARNINGS ON} directives, you can selectively turn off warnings that you don’t care about.

Но можно еще отключать специфические ворнинги типа {$PLATFORM_SPECIFIC OFF}
Полный список тут

1 лайк

Ну и еще в опциях проекта можно вручную отключить особо надоедливые варнинги

Просто не понятен прикол, который подкладывают новичкам. Я написал программу в Lazarus, которая собралась и даже работала, но иногда вылетала с runtime error. Я, как часто тут на форуме, естественно начал обвинять компилятор, глючная бесплатная хрень. И купил скачал Delphi. Перенес проект в него, и он мне кучу ошибок выдал, которые Lazarus проглатывал. И только потом, я допёр, что добрые дяди, решили меня не утруждать правильно изначально писать код, отключив по умолчанию проверки всего, что по факту нужно.

1 лайк

меня чуть кондратий не хватил))
хотя у меня есть лицензия на XE2, платила естесно фирма.

2 лайка

В дельфи они по умолчанию все включены, слава Б. :slight_smile:

Помню в начале 2000-х, запорол при переустановке винды комп, и так получилось, что не было возможности записать новую болванку, друг уехал, аварийного диска нет. Психанул и купил диск с Виндой. Меня потом все знакомые подкалывали, что я такой один :slight_smile:

1 лайк

дак вот на ком Билл Гейтс поднялся…

3 лайка