Hilfe bei der Programmierung

Hallo,

ich versuche eine Schaltung zu programmieren, bei der ein analoger Sensor zwei Relais steuert.
Das 1. Relais soll sich einschalten, danach das 2. Relais einschalten, dann das 2. Relais ausschalten, danach das 1. wieder aus. Dies funktioniert schon mit meiner Programmierung.

Nun möchte ich, dass das Programm nach Umschalten des Sensorwertes noch einmal durchläuft (wie oben beschrieben) und dann sich ausschaltet. Sobald sich der Sensorwert wieder ändert, soll es wieder starten.

Ich habe es mit einer If-Funktion versucht. Es läuft auch wie gewollt, nur sobald das Signal <400 schaltet es sich sofort aus, ich möchte aber, dass es noch eben eine Runde weiterläuft und dann beide auf HIGH setzt.

   int relais1 = 12;
  int relais2 = 13;
  int sensor = A0;
 
 
 void setup() { 
  
  pinMode(sensor,INPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
 }


void loop() {

  int value = analogRead(0);
  Serial.println(value);
  delay(20);
 
   sensor = analogRead(sensor);
   Serial.println(sensor,DEC);


    if (analogRead(A0)>400)
   
   {
  digitalWrite(13, LOW);
  delay(1000);
  digitalWrite(12, LOW);
  delay(1000);
  digitalWrite(12, HIGH);
  delay(1000);
  digitalWrite(13, HIGH);
  delay(1000);
   }

  
  if  (analogRead(A0)<400)
  
 
 { 

  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
     
  }

}

Bitte um Hilfestellung,

Vielen Dank im Vorraus &

Mit freundlichen Grüße

Hallo,

mir ist nicht ganz klar was Du vorhast. aber Du könntest die gesamte Schalterei noch einmmal machen und dann erst abschaten. Aber eigendlich ist das sehr ungeschickt.

such mal nach Schrittkette, endlicher Automat.

Heinz

Hi

Häh?
Anschaltet, Ausschaltet?

Was macht Dein Programm jetzt und was gefällt Dir daran nicht?
Wenn jetzt der Wert <400 fällt, werden 12 und 13 auf HIGH gesetzt - Das zwar ‘alle Nase lang’ - ändert aber Nichts an den Pins - Die bleiben HIGH.
Bei >400 werden beide Pins im Sekundentakt abgeschaltet und wieder angeschaltet - DAS allerdings auch wieder immer und immer wieder - hast Du ja so programmiert.

Was Du wohl möchtest:
Wert>400? → JA, starte Animation
Wert<400? → JA, Alles in Grundstellung (da die Animation eh blockierend ist und am Ende Grundstellung vorliegt - unnötig, kann nach setup()!

Du musst Dir ‘nur’ merken, ob Du die Animation bereits abgespielt hast - und diesen Merker löschen, wenn der Messwert kleiner wird.

if (messwert>400){
   animation=1;
}else{
   animation=0;
}
if (animation!=animationold){
   animationold=animation;
   if (animation){
      //Animation :)
   }else{
      //Relais abschalten
   }
}

Ok, leicht anderer Weg - wenn der Status von ‘animation’ sich gegenüber dem vorherigem Durchlauf geändert hat, führe eine Aktion aus.
Bei aktiver Animation … eben die Animation.
Bei nicht aktiver Animation … schalte die Relais ab.

Selber definiere ich mir

#define _AN=LOW
#define _AUS=!_AN

So kann ich im Sketch _AN und _AUS schreiben und wenn ich ein HIGH-Aktives Relais bekommt, ändere ich die erste Zeile in

#define _AN=HIGH

und Alles läuft - nur umgedreht.

MfG

PS: Auch solltest Du die verwendeten Pins am Anfang des Sketch definieren (bzw. per const byte anlegen) - dann kann der Kompiler nach Herzenslust optimieren.
Konstanes Zeug: const (z.B. Pin-Zuweisungen, Laufzeiten)
Korrekter (kleinst möglicher) Datentyp - für Pins reicht byte (0…255)

Und beschreibe mal warum du den analogen Pin A0 mehrfach einliest und den Wert n eine Variable überträgst, diese dann aber nicht richtig nutzt. Sondern immer nochmal den Pin ausliest.

eristoff100: Bitte um Hilfestellung,

Du solltest darauf achten, Deinen Code so zu schreiben, dass er kurz und leicht lesbar ist - überflüssige Leerzeilen raus, einheitliche und sinnvolle Einrückungen/Klammerungen usw.

Bei der Fehlersuche ist das Gold wert.

Gruß

Gregor

nochmal der überarbeitete Code, danke für die schnellen antworten aber ich weis noch immer nicht weiter bin absoluter Laie

ich würde gerne noch etwas dazu programmieren weis aber nicht wie,und zwar nach else soll nicht gleich beide relais auf aus gehen sondern noch einen Durchlauf machen An / An /Aus /Aus/ un dann erst entgültig Aus wenn sich dann der Sensor wert wider >400 ist soll wieder das normale programm laufen An/An/Aus/Aus

danke im voraus

 int relais1 = 12;
  int relais2 = 13;
  int sensor = A0;
  int An = LOW;
  int Aus = HIGH;
  
  
   void setup() 
  {
  pinMode(sensor,INPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  }
    void loop() 
  {
    int value = analogRead(A0);
  Serial.println(value);

    if (analogRead(A0)>400)
  {
  digitalWrite(relais1, An);
  delay(1000);
  digitalWrite(relais2, An);
  delay(1000);
  digitalWrite(relais2, Aus);
  delay(1000);
  digitalWrite(relais1, Aus);
  delay(1000);
  }
    else
  { 
  digitalWrite(relais1, Aus);
  digitalWrite(relais2, Aus);
  }
  }

(deleted)

eristoff100: ich würde gerne noch etwas dazu programmieren weis aber nicht wie

Dann wird es Zeit, die Grundlagen zu lernen.

Gruß Tommy

Hallo,

in der IDE gibt es doch genügend Beispiele die du durcharbeiten, verstehen und selbst erweitern kannst. Du muss Dich halt mit den Grundlagen beschäftigen.

Zu Deinem konkreten Problemchen , schau dir doch mal das Thema Funktionen an. Du könntest das Ein und Ausschalten in eine Funktion auslagern und die Funktion dann aufrufen wann es nötig ist.

das könnte so aussehen.

Heinz

const byte relais1 = 12; // const sie ändern sich ja nicht
const byte relais2 = 13;
const byte sensor = A0;
bool An = LOW; // bool es gibt nur ein oder aus 1/0
bool Aus = HIGH;
bool merker; // merker

void setup()
{
  Serial.begin(9600);
  // pinMode(sensor, INPUT); // bei analog Eingängen nicht erforderlich
  pinMode(relais1, OUTPUT);
  pinMode(relais2, OUTPUT);

}
void loop()
{
  int value = analogRead(A0); // eingan lesen
  Serial.println(value);

  if (value > 400)// Abfrag auf Schaltzustand
  {
    ablauf(); // function aufrufen
    merker = true; // merken das die funktion ausgeführt wurde
  }
  else if ( value < 380 && merker == true) // mit einer Hysterese damit der Zustand eindeutig ist
  {
    ablauf();
    merker = false; //nicht mehr ausführen
    digitalWrite(relais1, Aus);
    Serial.println("relais 1 aus");
    digitalWrite(relais2, Aus);
    Serial.println("relais 2 aus");
  }
}

void ablauf() {
  digitalWrite(relais1, An);
  Serial.println("relais 1 an");
  delay(1000);
  digitalWrite(relais2, An);
  Serial.println("relais 2 an");
  delay(1000);
  digitalWrite(relais2, Aus);
  Serial.println("relais 2 aus");
  delay(1000);
  digitalWrite(relais1, Aus);
  Serial.println("relais 1 aus");
  delay(1000);

}

Vielen dank Heinz, das hat funktioniert!

Marko

Rentner:
Hallo,

in der IDE gibt es doch genügend Beispiele die du durcharbeiten, verstehen und selbst erweitern kannst. Du muss Dich halt mit den Grundlagen beschäftigen.

Zu Deinem konkreten Problemchen , schau dir doch mal das Thema Funktionen an. Du könntest das Ein und Ausschalten in eine Funktion auslagern und die Funktion dann aufrufen wann es nötig ist.

das könnte so aussehen.

Heinz

const byte relais1 = 12; // const sie ändern sich ja nicht

const byte relais2 = 13;
const byte sensor = A0;
bool An = LOW; // bool es gibt nur ein oder aus 1/0
bool Aus = HIGH;
bool merker; // merker

void setup()
{
  Serial.begin(9600);
  // pinMode(sensor, INPUT); // bei analog Eingängen nicht erforderlich
  pinMode(relais1, OUTPUT);
  pinMode(relais2, OUTPUT);

}
void loop()
{
  int value = analogRead(A0); // eingan lesen
  Serial.println(value);

if (value > 400)// Abfrag auf Schaltzustand
  {
    ablauf(); // function aufrufen
    merker = true; // merken das die funktion ausgeführt wurde
  }
  else if ( value < 380 && merker == true) // mit einer Hysterese damit der Zustand eindeutig ist
  {
    ablauf();
    merker = false; //nicht mehr ausführen
    digitalWrite(relais1, Aus);
    Serial.println(“relais 1 aus”);
    digitalWrite(relais2, Aus);
    Serial.println(“relais 2 aus”);
  }
}

void ablauf() {
  digitalWrite(relais1, An);
  Serial.println(“relais 1 an”);
  delay(1000);
  digitalWrite(relais2, An);
  Serial.println(“relais 2 an”);
  delay(1000);
  digitalWrite(relais2, Aus);
  Serial.println(“relais 2 aus”);
  delay(1000);
  digitalWrite(relais1, Aus);
  Serial.println(“relais 1 aus”);
  delay(1000);

}