Проблема с MQTT + DS18B20 + Arduino Nano

Добрый день, очень надеюсь на вашу помощь, так как зашел в тупик.

Хочу забирать температуру с датчика, по mqtt и в конечном увидеть её в Zabbix
Но зашел в ступор ещё на получение её в мониторе, при проверке.

Код ниже

#include <UIPEthernet.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define CLIENT_ID       "ArduinoMQTT"
#define TOPIC           "temperature"
#define PUBLISH_DELAY   5000
#define ONE_WIRE_BUS 2

uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
IPAddress mqttServer(10,3,14,96);

EthernetClient ethClient;
PubSubClient mqttClient;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

long previousMillis;

void setup() {

  // setup serial communication
  Serial.begin(9600);
  while(!Serial) {};
  Serial.println(F("MQTT Arduino Demo"));
  Serial.println();
  
  // setup ethernet communication using DHCP
  if(Ethernet.begin(mac) == 0) {
    Serial.println(F("Unable to configure Ethernet using DHCP"));
    for(;;);
  }
  Serial.println(F("Ethernet configured via DHCP"));
  Serial.print("IP address: ");
  Serial.println(Ethernet.localIP());
  Serial.println();

  // setup mqtt client
  mqttClient.setClient(ethClient);
  mqttClient.setServer(mqttServer, 1883);
  Serial.println(F("MQTT client configured"));

  // setup MS18B20 sensor
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  Serial.println();
  Serial.println(F("Ready to send data"));
  previousMillis = millis();
}

void loop() {

  // it's time to send new data?
  if(millis() - previousMillis > PUBLISH_DELAY) {
    sendData();
    previousMillis = millis();
  }

  mqttClient.loop();
}

void sendData() {

  char msgBuffer[50];
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  float t = sensors.getTempCByIndex(0);
  Serial.print("Temperature: ");
  Serial.println(t);
    
  if(mqttClient.connect(CLIENT_ID)) {

    mqttClient.publish(TOPIC, dtostrf(t, 6, 2, msgBuffer));
  }
}

Что происходит в мониторе:

MQTT Arduino Demo

Ethernet configured via DHCP
IP address: 10.3.14.145

MQTT client configured

Dallas Temperature IC Control Library Demo
Ready to send data

Requesting temperatures…Temperature: -127.00

Собственно -127 отсутствие или не возможность достучаться до датчика. Но, если взять стандартный код, что предложен на Гите, по подключению датчика и работе через DallasTemp…
то показывается температура спокойно. Собственно подключение по пинам правильное и датчик рабочий.

Может есть какой-то нюанс, который я не могу заметить при взаимодействие mqtt и ds18b20 через Dallas, OneWire?

А тащить из MQTT в Zabbix - идея так себе.

Смысл моего вопроса не как доставить информацию в заббикс, а почему отваливается датчик при данном коде.

ENC28J60 в каком виде?

тестовый пример из библиотеки с получением температуры работает?

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

/*
 * The setup function. We only start the sensors here
 */
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

/*
 * Main function, get and show the temperature
 */
void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  // After we got the temperatures, we can print them here.
  // We use the function ByIndex, and as an example get the temperature from the first sensor only.
  float tempC = sensors.getTempCByIndex(0);

  // Check if reading was successful
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(tempC);
  }
  else
  {
    Serial.println("Error: Could not read temperature data");
  }
}

Вот данный код из примера библиотеки Dallas и он работает отлично, температура отображается.

Китай соответственно, вот этот.
image

Понятно. Пересади датчик с D2.

2 лайка

Удивительно, сработало, поведайте пожалуйста причину этих чудес?

На этом шилде INT выход ENC28J60 заведен на D2.

2 лайка

Спасибо!