Programm fast fertig - aber funktioniert nicht

Hallo,

das Programm, an dem ich jetzt seit einem Weilchen sitze, ist soweit fertig, allerdings passiert am Ende nicht das, was geplant war, sondern gar nichts. Programmabschnitt 2 scheint soweit zu funktionieren, Abschnitt 1 macht aber gar nichts. Der Gedanke dahinter: über zwei Taster wird die Einschaltzeit einer Lampe gesteuert, die entsprechende Zeit wird in einer Variable zwischengespeichert. Das Serial.println sollte nur zur Kontrolle dienen und hat keinen wirklichen Zweck. Allerdings passiert absolut gar nichts, ich möchte jetzt aber auch nicht planlos irgendwas im Programm ändern, ohne zu verstehen, wieso ich das tu.

Den 3. Abschnitt konnte ich noch nicht testen, da wäre es schön, wenn jemand sagen kann, ob das grundsätzlich so funktionieren kann :slight_smile:

Board: Arduino Uno R3
IDE: 1.8.19

        
#include <DS1307RTC.h>
#include <Wire.h>
#include <TimeLib.h>

int feucht1Pin = digitalRead(A0);
int feucht2Pin = digitalRead(A1);
int feucht3Pin = digitalRead(A2);
int feucht4Pin = digitalRead(A3);
bool lischraPin = digitalRead(5);
bool bltasterPin = digitalRead(6);
bool wttasterPin = digitalRead(7);


const int motlichtPin = 12 ;
const int lampenPin = 11;
const int wasserPin = 10;

int lichtdauer;

void setup() {
  // put your setup code here, to run once:

Serial.begin(9600);
setSyncProvider(RTC.get);

pinMode(feucht1Pin, INPUT);
pinMode(feucht2Pin, INPUT);
pinMode(feucht3Pin, INPUT);
pinMode(feucht4Pin, INPUT);
pinMode(lischraPin, INPUT);
pinMode(bltasterPin, INPUT);
pinMode(wttasterPin, INPUT);

pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);

pinMode(wasserPin, OUTPUT);
pinMode(lampenPin, OUTPUT);
pinMode(motlichtPin, OUTPUT);



}

void loop() {
  
  // put your main code here, to run repeatedly:

//1:

if (bltasterPin == HIGH) 
  {lichtdauer = 12;};

if (wttasterPin) == HIGH)
  {lichtdauer = 18;};

if (lichtdauer == 18)
   Serial.println(18);
  {if (hour() == 5 && minute() == 0 && second() == 0)
    {digitalWrite(lampenPin, HIGH);
    delay(200);
    digitalWrite(lampenPin, LOW);}

  if (hour() == 23 && minute() == 0 && second() == 0)
    {digitalWrite(lampenPin, HIGH);
    delay(200);
    digitalWrite(lampenPin, LOW);}}


if (lichtdauer == 12)
  Serial.println(12);
  {if (hour() == 9 && minute() == 0 && second() == 0)
    {digitalWrite(lampenPin, HIGH);
    delay(200);
    digitalWrite(lampenPin, LOW);}

  if (hour() == 21 && minute() == 0 && second() == 0)
    {digitalWrite(lampenPin, HIGH);
    delay(200);
    digitalWrite(lampenPin, LOW);}}



//2

if (digitalRead(5) == true) //lischraPin funktioniert nicht
    {digitalWrite(motlichtPin, HIGH);
    delay(1500);
    digitalWrite(motlichtPin, LOW);}




//3

if (hour() == 8 && minute() == 0)
  {if (analogRead(feucht1Pin >= 500)
   || analogRead(feucht2Pin >= 500)
   || analogRead(feucht3Pin >= 500)
   || analogRead(feucht4Pin >= 500))
      {digitalWrite(wasserPin, HIGH);
      delay(20000);
      digitalWrite(wasserPin, LOW);
      }};


}

Das wage ich zu bezweifeln :wink:
Dein Programm ist ziemlich sinnfrei so wie es ist. Offensichtlich fehlen dir noch ein paar Grundlagen. Deshalb würde ich empfehlen, dass Du das ganz schrittweise angehst und anhand der Beispiele lernst, wie z.B. das Einlesen eines Tasters funktioniert. Also z.B. erstmal einfach einen Taster einlesen und am Monitor ausgeben. Und wenn du das dann verstanden hast und es funktioniert nimm den nächsten Schritt in Angriff.
So wie Du das bisher angegangen bist, wird das nichts.

1 Like

Insbesondere diese Aufrufe außerhalb von setup() oder loop() können so nicht gehen.

Gab es da keine Warnungen?

Da sind noch mehr Fehler drin, weshalb es auch nicht kompiliert. Deshalb kann ich auch das:

nicht nachvollziehen, dann da es nicht kompiliert, kann man es auch nicht laden und testen.

@henrik-97 : Drück auch mal ctrl-T in der IDE um den Code ordentlich zu formatieren. Da sollte dir dann auch einiges auffallen - z.B. bei den Serial.print().

Berichtigen.

Hallo,

probiere einmal, wenn es klappt schaue dir die Unterschiede an. Mangels Libs kann ich das nicht testen.

Sketch
#include <DS1307RTC.h>
#include <Wire.h>
#include <TimeLib.h>

const byte feucht1Pin = A0;
const byte feucht2Pin = A1;
const byte feucht3Pin = A2;
const byte feucht4Pin = A3;
const byte lischraPin = 5;
const byte bltasterPin = 6;
const byte wttasterPin = 7;
const byte motlichtPin = 12;
const byte lampenPin = 11;
const byte wasserPin = 10;

int lichtdauer;

void setup()
{
  Serial.begin(9600);
  setSyncProvider(RTC.get);

  pinMode(wasserPin, OUTPUT);
  pinMode(lampenPin, OUTPUT);
  pinMode(motlichtPin, OUTPUT);
}

void loop()
{
  //1:
  if (digitalRead(bltasterPin) )
  {
    lichtdauer = 12;
  }

  if (digitalRead(wttasterPin) )
  {
    lichtdauer = 18;
  }

  if (lichtdauer == 18)
  {
    Serial.println(18);

    if ( hour() == 5 && minute() == 0 && second() == 0 )
    { digitalWrite(lampenPin, HIGH);
      delay(200);
      digitalWrite(lampenPin, LOW);
    }

    if ( hour() == 23 && minute() == 0 && second() == 0 )
    { digitalWrite(lampenPin, HIGH);
      delay(200);
      digitalWrite(lampenPin, LOW);
    }
  }

  if (lichtdauer == 12)
  {
    Serial.println(12);
    if ( hour() == 9 && minute() == 0 && second() == 0 )
    {
      digitalWrite(lampenPin, HIGH);
      delay(200);
      digitalWrite(lampenPin, LOW);
    }

    if ( hour() == 21 && minute() == 0 && second() == 0 )
    {
      digitalWrite(lampenPin, HIGH);
      delay(200);
      digitalWrite(lampenPin, LOW);
    }
  }

  //2
  if (digitalRead(lischraPin) ) //lischraPin funktioniert nicht
  {
    digitalWrite(motlichtPin, HIGH);
    delay(1500);
    digitalWrite(motlichtPin, LOW);
  }

  //3
  if ( hour() == 8 && minute() == 0 )
  {
    if ( analogRead(feucht1Pin) >= 500 || analogRead(feucht2Pin) >= 500 || analogRead(feucht3Pin) >= 500 || analogRead(feucht4Pin) >= 500 )
    {
      digitalWrite(wasserPin, HIGH);
      delay(20000);
      digitalWrite(wasserPin, LOW);
    }
  }
}

Danke erstmal für die Antworten.

Hab die vor-Setup-Fehler korrigiert. Kompiliert hatte das Programm aber.
Der überarbeitete Code hilft mir super weiter, der scheint auf dem ersten Blick richtig zu funktionieren, da kann ich jetzt vergleichen und probieren :slight_smile:

Dazu gleich eine Frage: Inputs müssen wohl nicht extra deklariert werden?

Nach einem Reset stehen alle Eingänge standardmäßig auf INPUT. Da muss man also eigentlich nichts machen.
Ich würd's trotzdem im Setup machen - schon der Vollständigkeit halber. Es ist dann ganz klar, was als Eingang und was als Ausgang genutzt wird. Es kann ja auch sein, dass man mal auf INPUT_PULLUP umstellt. Aber letztendlich ist das Geschmacksache. Notwendig ist es nicht.

Ah, alles klar.

man sollte für restlos alle IO-pins die man im Programm verwendet Konstanten definieren.

Das hat mehrere Vorteile:

Wenn man je mal eine IO-pin nummer ändert ändert man die Nummer nur an einer einzigen Stelle und ist fertig mit dem abändern. Weil ja an allen anderen Stellen der Konstantenname verwendet wird.

Wenn man aus versehen einer Konstanten einen Wert zuweisen will dann meckert der Compiler das das nicht geht.

würde dann so aussehen

const byte feucht1Pin = A0;
const byte feucht2Pin = A1;
const byte feucht3Pin = A2;
const byte feucht4Pin = A3;
const byte lischraPin = 5;
const byte bltasterPin = 6;
const byte wttasterPin = 7;

Damit ist nur definiert welche IO-pin nummer über welche Konstante angesprochen werden.

Um den Zustand des IO-pins einzulesen braucht man dann Variablen
die zusätzlich definiert werden müssen.

vgs

Danke, jetzt bin ich so langsam im Bilde :smiley:

Ich hab gestern und heute noch etwas am Programm gebastelt und probiert und noch etwas dazugeschrieben, es funktioniert jetzt, soweit ich das prüfen kann, wie gewünscht.

Noch einwas: es ist nicht direkt aus dem Code ersichtlich, aber es werden Feuchtigkeitssensoren benutzt. Diese haben aber einen viel größeren Wertebereich, als man mit Byte verarbeitet kriegen würde. Deshalb würde ich da mit Integer arbeiten. Also byte gegen int getauscht. Kann es da zu irgendwelchen Problemen kommen?

Naja nur so gaaanz langsam und teilweise.

Die Konstanten legen die IO-pin-Nr fest. Deine IO-pin Nummern haben Werte 0 bis 50

Den Meßwert den du von einem analogen IO-pin einliest ist etwas ganz anderes!

Die IO-pin Nr ist vergleichbar mit einer Adresse.
Du gehst zu der Adresse hin und dann schaust du auf das Barometer (Das Luftdruckmeßgerät)
Da kann dann sehr wohl an der Adresse Arduino-Straße 3 auf dem Barometer der Meßwert 1050 hektopascal stehen.

Und an der der Adresse Arduino-Straße 4 auf dem Wasserzähler der Meßwert 4558 Lieter stehen.

usw.

vgs

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.