ARDUINO Датчик температуры

Roman09

✩✩✩✩✩✩✩
3 Окт 2023
1
0
Заголовок темы должен отражать суть. Переформулируй или тема будет удалена
есть ардуино уно и езернет шилд w5100 и датчик температуры ds18b20. Нужно сделать чтоб датчик температуры передавал данные по SNMP. скетч работает но ответа по SNMP нет. перепробовал много разных скетчей. баловался и с oid и с айпишниками ниче не помогает. на шилде горит link и fullo


#include <OneWire.h>
#include <UIPEthernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // random MAC
byte ip[]= {192,168,11,249};
String readString = String(64);
byte addr[8]; // DS18B20 1-wire address
OneWire ds(4); // DS18B20 at pin 4
EthernetServer server(10050); // Zabbix port
// Zabbix protocol description:
// https://www.zabbix.com/documentation/1.8/protocols
// https://www.zabbix.com/documentation/1.8/protocols/agent
void setup() {
ds.search(addr);

// время для инициализации Ethernet
delay(500);
// массив смещений чтобы пропустить код датчика и пропустить мак
mac[1] = addr[3];
mac[2] = addr[4];
mac[3] = addr[5];
mac[4] = addr[6];
mac[5] = addr[7];
// запуск ethernet подключения
Ethernet.begin(mac);
server.begin();
// Resolution (9..12 bit)
//
// This is done ONCE in setup()
//
// bits
// of
// precision
// 0 - 9
// 1 - 10
// 2 - 11
// 3 - 12
int t_precision = 1; // adjust loop() delay!
ds.select(addr);
ds.write(0x4E);
// write zero into the alarm registers
ds.write(0);
ds.write(0);
// and write t_precision into the configuration register
// to select the precision of the temperature
ds.write(t_precision << 5);
// Write them to the EEPROM
ds.write(0x48);
// Serial.begin( 38400 ); // uncomment for debug output
/*
byte i;
Serial.print( " Ethernet MAC =" );
for( i = 0; i < 6; i++ )
{
Serial.write( ' ' );
Serial.print( mac, HEX );
}
Serial.println();
*/
}
void loop() {
byte data[2];
byte l;
float celsius;
readString = "";
l = 0;
if (EthernetClient client = server.available())
{
while (client.connected()) {
if (client.available()) {
if (l < 63) {
char c = client.read();
readString.concat(c);
l = readString.length();
}
if ((l > 5) & (l == (byte)readString[5] + 13)) // end of query from zabbix server
{
String request = readString.substring(13);
if (request.endsWith("\n")) {
request.remove(request.length() - 1);
}
if (request.equals("agent.ping")) {
client.print("ZBXD\x01"); // reply header
byte replyBytes [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '1'}; //4 bytes - length, 4 - reserved, 1 - data
client.write(replyBytes, 9);
}
else
if (request.equals("env.temp")) {
ds.reset();
ds.select(addr);
ds.write(0x44); // start conversion, with regular (non-parasite!) power
delay(250); // min {750, 375, 188, 94}ms for a {12,11,10,9}-bit conversion, respectively
ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

data[0] = ds.read();
data[1] = ds.read();

int16_t raw = (data[1] << 8) | data[0];
celsius = (float)raw / 16.0;

client.print("ZBXD\x01"); // reply header
byte replyBytes [] = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //4 bytes - length, 4 - reserved
client.write(replyBytes, 8);
client.print(celsius);
}
else {
client.print("ZBXD\x01"); // reply header
byte replyBytes [] = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //4 bytes - length, 4 - reserved
client.write(replyBytes, 8);
client.print("ZBX_NOTSUPPORTED");
}
break;
}
}
}
delay(10);
client.stop();
}
}
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
перепробовал много разных скетчей
если так и будете пробовать всякие копипасты без хотя бы примерного понимания того как это должно работать, то ничего не получится.
Начините хотя бы с того что поместите код под соотвествующий тег и спрячте под спойлер - читать это невозможно.
намек: snmpv2 работает по UDP, вы где-нибудь видите в скетче работу с UDP? Кроме того, пытаться сделать snmp-сервер из ардуины, так себе идея. Это слишком сложно и не нужно, обычно из ардуины делают клиент, который сам отправляет данные куда-то на сервер.
 

Брякомякс

★✩✩✩✩✩✩
14 Янв 2023
95
20
А вообще критичен именно SNMP ?
Идея прикольная, но я бы попробовал использовать формат Prometheus. Если есть код для генерации простой веб-страницы, то должно (теоретически) взлететь.

Забикс же и с тем и с тем работает.