Hallo zusammen,
mir ist nicht klar, warum die LEDs kurz aufblitzen. Vielleicht könnt ihr mir bei der Fehlersuche behilflich sein.
Hardware:
Arduino Nano
An Pin 7 bis Pin 12 hängt jeweils eine LED mit passendem Vorwiderstand.
Stromversorgung über USB-Kabel
Der DHT22 ist zur Fehlersuche schon abgesteckt und kann natürlich nicht gefunden werden, was zur Time-Out-Fehlermeldung führt.
Nur warum blitzen die gelbe LED an Pin 9 und die grüne LED an Pin 10 im Abstand von ein paar Sekunden auf? Zeitlich passt das mit der seriellen Übertragung zusammen, aber ich kann mir das nicht erklären.
Den Code habe ich immer weiter gekürzt, um den Fehler zu finden, deshalb bitte nicht wundern, dass der nichts Sinnvolles mehr macht, aber auch dieser Coderest führt zum beschriebenen Fehler.
Ich habe schon einen anderen Nano ausprobiert, um ein Hardwareproblem auszuschließen, aber der verhält sich gleich. Die Platine habe ich auch schon abgesteckt und die LEDs direkt an die Arduino Pins angeschlossen, somit kann ich einen Platinenfehler auch ausschließen.
Kommentiere ich die Zeile "DHTStatus = DHT.read22(DHT22Pin);" aus, ist kein Aufblitzen mehr da.
Wie kann ich den Fehler weiter eingrenzen? Vielen Dank für eure Hilfe.
Hier noch der Code:
#include <DHT.h>
const byte SendenPin = 4;
const byte InBetriebPin = 5; // High, wenn einer sendet; dient der Kollisionsvermeidung; 680Ohm SMD Schutzwiderstand für PortPin; ein 10KOhm Pulldown für gesamte Leitung
const byte LEDrot2 = 7;
const byte LEDrot1 = 8;
const byte LEDgelb = 9;
const byte LEDgruen1 = 10;
const byte LEDgruen2 = 11;
const byte LEDblau = 12;
const byte DHT22Pin = A7; // DHT22 / AM2302-Luftfeuchte und Temperatursensor
int DHTStatus;
unsigned long HygrometerIntervall = 5000;
unsigned long lHygrometer = 0;
dht DHT;
void setup()
{
pinMode(LEDrot2, OUTPUT);
pinMode(LEDrot1, OUTPUT);
pinMode(LEDgelb, OUTPUT);
pinMode(LEDgruen1, OUTPUT);
pinMode(LEDgruen2, OUTPUT);
pinMode(LEDblau, OUTPUT);
pinMode(DHT22Pin, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(SendenPin, OUTPUT);
pinMode(InBetriebPin, INPUT);
Serial.begin(9600);
}
void loop()
{
if (millis() - lHygrometer > HygrometerIntervall) {
DHTStatus = DHT.read22(DHT22Pin);
Max485Senden(true);
Serial.println(F("<Fehler>Time out Error</Fehler>"));
Max485Senden(false);
lHygrometer = millis();
}
}
void Max485Senden(bool senden)
{
int var;
if (senden) {
var = 0;
while ((digitalRead(InBetriebPin) == HIGH) or (var > 20)) {
var++;
}
if (var < 21) { // wenn der Bus frei ist senden, ansonsten geht die Nachricht nicht raus, dass das Max485Modul nicht im Sendebetrieb ist
pinMode(InBetriebPin, OUTPUT); // Betriebsleitung ansteuern
digitalWrite(InBetriebPin, HIGH); // Betriebsleitung Sendebetrieb kundtun; Achtung Schutzwiderstände erforderlich, um keinen Kurzschluss zwischen 2 Arduinos zu erzeugen
delay(3);
digitalWrite(SendenPin, HIGH); // Max485Modul in Sendebetrieb schalten
}
}
else {
digitalWrite(SendenPin, LOW); // Max485Modul in Empfangsbetrieb schalten
digitalWrite(InBetriebPin, LOW); // Betriebsleitung Sendebetrieb beenden so geht es schneller, als nur über den Pulldown die Ladung abfließen zu lassen
delay(3);
pinMode(InBetriebPin, INPUT); // Betriebsleitung nicht mehr aktiv treiben Pulldown hält Leitung auf GND, wenn keiner sendet
}
}
Die Lib-Dateien von Rob Tillaart füge ich mal an, sind aber von mir nicht verändert.
DHT.cpp (4.42 KB)
DHT.h (1.4 KB)