Собственно вставал на эти грабли два раза. Сначала очень удивился когда программа скомпилировалась под УНО, а когда попробовал скомпилить тоже самое под 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 вагон и маленькая тележка.
Это единственная не стандартная. На скорость не влияет. Бери любую, например 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 свичу не судьба прописАть?
гыы…
Дед, вот ты хакерюга!)
все завелось.
О чем вас ворнинги чесно пердуперждали…
Деда, вопрос к профи 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}
Полный список тут
Просто не понятен прикол, который подкладывают новичкам. Я написал программу в Lazarus, которая собралась и даже работала, но иногда вылетала с runtime error. Я, как часто тут на форуме, естественно начал обвинять компилятор, глючная бесплатная хрень. И купил скачал Delphi. Перенес проект в него, и он мне кучу ошибок выдал, которые Lazarus проглатывал. И только потом, я допёр, что добрые дяди, решили меня не утруждать правильно изначально писать код, отключив по умолчанию проверки всего, что по факту нужно.
меня чуть кондратий не хватил))
хотя у меня есть лицензия на XE2, платила естесно фирма.
В дельфи они по умолчанию все включены, слава Б.
Помню в начале 2000-х, запорол при переустановке винды комп, и так получилось, что не было возможности записать новую болванку, друг уехал, аварийного диска нет. Психанул и купил диск с Виндой. Меня потом все знакомые подкалывали, что я такой один
дак вот на ком Билл Гейтс поднялся…