Добрый день
Это мой первый код и возникла проблема
Если это не противоречит правилам, подскажите пожалуйста, из за чего возникает проблема.
Используется оборудование:
Ардуино мини;
сетевой шилд ENC28J60;
дисплей на TM74HC595.
Код собран из кусков примеров используемых библиотек.
Проблема в следующем, если модуль получает IP адрес от DHCP или адрес присваивается в ручную, то данные mqtt серверу данные отправляются, но не отображаются на табло.
Если закомментировать строчку Ethernet.begin(mac, ip); и IP адрес 0.0.0.0, то данные на модуле табло отображаются.
У меня есть предположение, что не хватает памяти, но другой платы ардуино у меня нет и проверить не могу.
Информация при компиляции скетча: “Скетч использует 24828 байт (86%) памяти устройства. Всего доступно 28672 байт.
Глобальные переменные используют 1268 байт (61%) динамической памяти, оставляя 780 байт для локальных переменных. Максимум: 2048 байт.”
Код:
#include <UIPEthernet.h>
#include <TBPubSubClient.h>
#include <microDS18B20.h>
#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>
#define CLIENT_ID "SensorMQTT"
#define TOPIC "sensor/temp" // наименование топика
#define PUBLISH_DELAY 6000
#define MQQT_SERV 172, 31, 10, 190 // mqtt сервер
#define MQQT_PORT 1883 // mqtt порт
#define DATA_PIN 10 // Пины для подключения дисплея.
#define RCLK_PIN 11
#define SCLK_PIN 12
#define DISP_PERIOD 3000
byte mac[6] = { 0xA8, 0x61, 0x0A, 0x01, 0x08, 0x04 };
byte ip[4] = { 172, 31, 10, 184 };
EthernetClient ethClient;
PubSubClient mqttClient;
MicroDS18B20<3> sensor;
IPAddress mqttServer(MQQT_SERV);
Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);
long previousMillis;
float tm = (sensor.getTemp()); // получить первоначальные данные датчика
void setup() {
Serial.begin(115200);
while (!Serial) {};
/*
if (Ethernet.begin(mac) == 0) {
Serial.println(F("Unable to configure Ethernet using DHCP"));
for (;;)
;
}
*/
Ethernet.begin(mac, ip);
mqttClient.setClient(ethClient);
mqttClient.setServer(mqttServer, MQQT_PORT);
Serial.print("IP address: ");
Serial.println(Ethernet.localIP());
previousMillis = millis();
Timer2.setPeriod(DISP_PERIOD);
Timer2.enableISR();
}
void loop() {
if (millis() - previousMillis >= PUBLISH_DELAY) {
readData(); /* Читаем данные с датчика */
visData(); /* Выведем данные на дисплей */
sentData(); /* Отправляем данные mqtt на сервер */
previousMillis = millis();
}
mqttClient.loop();
}
void readData() {
if (sensor.readTemp())
tm = (sensor.getTemp());
sensor.requestTemp();
}
void sentData() {
char msgBuffer[20];
if (mqttClient.connect(CLIENT_ID)) {
if (tm != 0) {
mqttClient.publish(TOPIC, dtostrf(tm, 6, 2, msgBuffer));
}
}
}
void visData() {
disp.clear();
disp.displayFloat(tm, 2);
delay(1000);
}
ISR(TIMER2_A) {
disp.tickManual(); // Обслуживание динамической индикации дисплея
}