Hallo liebe Arduino-Gemeinde,
ich bastele schon lange mit dem Arduino und gerade durch die vielen Anregungen hier aus dem Forum konnte ich schon viele nette Projekte umsetzen.
Einige dieser Projekte laufen mit Verzögerungen basierend auf der "millis"-Abfrage.
Beim aktuellen Projekt fällt mir jedoch auf, dass trotz Nutzung von "millis" der Ablauf verzögert wird.
Ich hoffe ihr könnt mir helfen.
Bei dem Projekt soll der Arduino jeweils eine LED ansteuern und die über die Analogeingänge angeschlossenen Fototransistoren auswerten.
Wird der eingestellte Schwellwert unterschritten soll der dazu gehörige Ausgang für eine definierte Zeit schalten.
Ziel ist es jeweils einen Gas- und einen Wasserzähler abzufragen, und eine S0-Signal zu erzeugen.
Danke für eure Hilfe.
/* Der Lesekopf soll in einem festgelegtem Intervall IR-Impulse
* senden und den entsprechenden Eingang auslesen.
* Sinkt der Eingangswert unter den Schwellwert, soll der zugehörige
* Ausgang für eine festgelegte Zeit auf 0 schalten.
*/
const int gasPin = A5;
const int gasIRPin = 4;
const int gasOUTPin = 6;
const int gasLEDPin = 2;
const int waterPin = A3;
const int waterIRPin = 5;
const int waterOUTPin = 7;
const int waterLEDPin = 3;
unsigned long letzteMillis = 0;
unsigned long gasIRPuls = 20;
unsigned long gasOUTPuls = 1000;
unsigned long gasOUTPause = 500;
unsigned long gasLED = 1000;
unsigned long waterIRPuls = 20;
unsigned long waterOUTPuls = 1000;
unsigned long waterOUTPause = 500;
unsigned long waterLED = 1000;
int gasValueOff = 1023;
int gasValueOn = 1023;
int gasTrigger = 200;
int waterValueOff = 1023;
int waterValueOn = 1023;
int waterTrigger = 200;
void setup() {
// put your setup code here, to run once:
digitalWrite(gasPin, INPUT_PULLUP);
pinMode(gasIRPin, OUTPUT);
digitalWrite(gasIRPin, LOW);
pinMode(gasOUTPin, OUTPUT);
digitalWrite(gasOUTPin, HIGH);
pinMode(gasLED, OUTPUT);
digitalWrite(gasLED, LOW);
digitalWrite(waterPin, INPUT_PULLUP);
pinMode(waterIRPin, OUTPUT);
digitalWrite(waterIRPin, LOW);
pinMode(waterOUTPin, OUTPUT);
digitalWrite(waterOUTPin, HIGH);
pinMode(waterLED, OUTPUT);
digitalWrite(waterLED, LOW);
Serial.begin (9600);
}
void timer_gasIR ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < gasIRPuls);
{}
}
void timer_gasPuls ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < gasOUTPuls);
{}
}
void timer_gasPause ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < gasOUTPause);
{}
}
void timer_gasLED ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < gasLED);
{}
}
void timer_waterIR ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < waterIRPuls);
{}
}
void timer_waterPuls ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < waterOUTPuls);
{}
}
void timer_waterPause ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < waterOUTPause);
{}
}
void timer_waterLED ()
{
unsigned long letzteMillis = millis();
while((millis() - letzteMillis) < waterLED);
{}
}
void GasLED ()
{
digitalWrite(gasLEDPin, HIGH);
timer_gasLED ();
digitalWrite(gasLEDPin, LOW);
}
void WaterLED ()
{
digitalWrite(waterLEDPin, HIGH);
timer_waterLED ();
digitalWrite(waterLEDPin, LOW);
}
void Gaszaehler ()
{
digitalWrite(gasIRPin, HIGH);
gasValueOff = analogRead(gasPin);
timer_gasIR ();
digitalWrite(gasIRPin, LOW);
gasValueOn = analogRead(gasPin);
if (gasValueOn < 300) // if (gasValueOn < (gasValueOff - gasTrigger))
{
digitalWrite(gasOUTPin, LOW);
GasLED ();
timer_gasPuls ();
digitalWrite(gasOUTPin, HIGH);
timer_gasPause ();
Serial.print("gasIROn");
Serial.println(gasValueOn);
Serial.print("gasIROff");
Serial.println(gasValueOff);
} else {
digitalWrite(gasOUTPin, HIGH);
Serial.print("gasIROn");
Serial.println(gasValueOn);
Serial.print("gasIROff");
Serial.println(gasValueOff);
}
timer_gasIR ();
}
void Wasserzaehler ()
{
digitalWrite(waterIRPin, HIGH);
waterValueOff = analogRead(waterPin);
timer_waterIR ();
digitalWrite(waterIRPin, LOW);
waterValueOn = analogRead(waterPin);
if (waterValueOn < 300) // if (waterValueOn < (waterValueOff - waterTrigger))
{
digitalWrite(waterOUTPin, LOW);
WaterLED ();
timer_waterPuls ();
digitalWrite(waterOUTPin, HIGH);
timer_waterPause ();
Serial.print("waterIROn");
Serial.println(waterValueOn);
Serial.print("waterIROff");
Serial.println(waterValueOff);
} else {
digitalWrite(waterOUTPin, HIGH);
Serial.print("waterIROn");
Serial.println(waterValueOn);
Serial.print("waterIROff");
Serial.println(waterValueOff);
}
timer_waterIR ();
}
void loop() {
// put your main code here, to run repeatedly:
Gaszaehler ();
Wasserzaehler ();
}