Ich möcht vorab mein kleines Prjoekt vorstellen.
Es handelt sich um einen Umweltsensor wo man über einen Arduino Pro Mini oder einen Arduino Nano Werte von digitalen oder analogen Sensoren erfassen kann, und sie über den 1-wire Bus ( DS18B20 Emulator ) an die 1-WireExtension (nicht getestet ) oder an einen Arduino UNO mit Ethernetshield und dann per UDP an den MiniServer weiterleitet.
Der Arduino Pro Mini kann bis zu 5 DS18B20 Temperautrsensoren emulieren - GETESTET
mehr als 5 wurden bei mir nicht alles Werte übertragen.
Dabei fragt der Arduino Mini einen DHT22 für Feuchte und Temperatur ab, und einen Ambient Light Sensor kurz ALS an einem analogen Eingang ab und sendet die Daten ( Feuchte, Temperatur, Umgebungslicht) jeweils als einen DS18B20 mit eigener Adresse auf den 1-Wire BUS
Natürlich kann man auch wie gewohnt andere 1-Wire Chips mit auf den Bus legen, getestet mit weiteren DS18B20, DS2450, DS2438.
Ich denke gerad darüber nach eine passende Platine die man in eine Hohlwanddose setzen kann nach. Das ganze soll als Eingangsspannung mit 24V betrieben werden. Grund dafür, es soll genug Power für alles Sensoren + einen VOC Sensor der etwas Strom zieht, liefern.
Jetzt noch den viel diskutierten billige Bewegungsmelder aus China dazuknüpfen und schon hat man die Eierlegendevollmilchsau für ein paar Euro.
Hier schon mal den Code für den Arduino Pro Mini
/* Example-Code that emulates a DS18B20 Tested with: - https://github.com/PaulStoffregen/OneWire --> DS18x20-Example, atmega328@16MHz as Slave - DS9490R-Master, atmega328@16MHz as Slave */ #include "OneWireHub.h" #include "DS18B20.h" // Digital Thermometer, 12bit #include <dht.h> dht DHT; #define DHT22_PIN 6 int sensorPin = A0; float sensorValue = 0; const uint8_t led_PIN = 13; // the number of the LED pin const uint8_t OneWire_PIN = 8; auto hub = OneWireHub(OneWire_PIN); auto sensorA = DS18B20(0x28, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x01); // Digital Thermometer auto sensorB = DS18B20(0x28, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x02); // Digital Thermometer auto sensorC = DS18B20(0x28, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x03); // Digital Thermometer //auto sensorD = DS18B20(0x28, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x04); // Digital Thermometer //auto sensorE = DS18B20(0x28, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x05); // Digital Thermometer float DHT_temp = 0; float DHT_humid = 0; bool blinking() { const uint32_t interval = 500; // interval at which to blink (milliseconds) static uint32_t nextMillis = millis(); // will store next time LED will updated if (millis() > nextMillis) { nextMillis += interval; // save the next time you blinked the LED static uint8_t ledState = LOW; // ledState used to set the LED if (ledState == LOW) ledState = HIGH; else ledState = LOW; digitalWrite(led_PIN, ledState); return 1; } return 0; } void setup() { Serial.begin(9600 ); Serial.println("OneWire-Hub DS18B20 Temperature-Sensor"); pinMode(led_PIN, OUTPUT); // Setup OneWire hub.attach(sensorA); hub.attach(sensorB); hub.attach(sensorC); //hub.attach(sensorD); //hub.attach(sensorE); // Set const temperature Serial.println("config done"); } void loop() { //read analaginpur // following function must be called periodically hub.poll(); // this part is just for debugging (USE_SERIAL_DEBUG in OneWire.h must be enabled for output) if (hub.getError()) hub.printError(); // Blink triggers the state-change do_dht(); if (blinking()) { /* // Set temp static float temperature = 20.0; temperature += 0.1; if (temperature > 30.0) temperature = 20.0; sensorA.setTemp(temperature); */ sensorValue = analogRead(sensorPin) / 10.0; sensorA.setTemp(sensorValue); } } void do_dht() { const uint32_t interval = 1000; // interval at which to blink (milliseconds) static uint32_t nextMillis = millis(); // will store next time LED will updated if (millis() > nextMillis) { nextMillis += interval; // save the next time you blinked the LED int chk = DHT.read22(DHT22_PIN); switch (chk) { case DHTLIB_OK: Serial.print("OK,\t"); DHT_temp = (DHT.temperature); DHT_humid = (DHT.humidity); sensorB.setTemp(DHT_temp); sensorC.setTemp(DHT_humid); break; case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error,\t"); break; case DHTLIB_ERROR_TIMEOUT: Serial.print("Time out error,\t"); break; default: Serial.print("Unknown error,\t"); break; } Serial.print("Temperatur: "); Serial.print(DHT_temp); Serial.print(",\t"); Serial.print("Feuchte: "); Serial.print(DHT_humid); Serial.print(",\t"); Serial.print("Helligkeit: "); Serial.print(sensorValue); Serial.println(",\t"); //sensorD.setTemp(40); //sensorE.setTemp(40); } }
Kommentar