4 kanaalsrelais met veiligheid

hallo

ik probeer dit resultaat te bekomen voor in een afzuiginstalatie

druk knop 1 doet relais 1 aan maar doet relais 2 en 3 uit
druk knop 2 doet relais 2 aan maar doet relais 1 en 3 uit
druk knop 3 doet relais 3 aan maar doet relais 3 en 2 uit

4de knop om de lamp uit en aan te doen

ik gebruik een arduino uno jaja van den chinees maar dat macheert hopelijk even goed het gaat om de code heb er ook originele moest het toch niet gaan ( bedoeling is dat de goedkoopste er in gaat )

nu verder dan dat ik met de knoppen ze op en af krijg en er dus 2 of 3 tegelijk kunnen geraak ik niet

de code dat ik hiervoor gebruik ( let wel ik ben nog in leerfase de persoon die me er bij hielp is helaas overleden , vandaar ook complexe code ik ben nog zover niet)

ps: je ziet in afbeelding leds dat is ter illustratie omdat ik simuleer in tinkercad en zo een 4 kanaals relaiskaart er niet op vond

const int pushButton[] ={2,3,4,5};// define push button inputs
const int relayPin[]={11,10,9,8};// output pins where 4 relays will be connected
String relayNames[] ={"CH1", "CH2","CH3","CH4"};// Just put name for 4 relays
int pushed[] ={0,0,0,0};// status of each buttons
int relayStatus[] ={HIGH,HIGH,HIGH,HIGH};// initial status of relay


void setup() {
 
  Serial.begin(9600);// initialize serial monitor 
  for(int i=0; i<4; i++)
  {
    pinMode(pushButton[i], INPUT_PULLUP); 
    pinMode(relayPin[i], OUTPUT);   
    digitalWrite(relayPin[i], HIGH);// initial relay status to be OFF
  }


}

void loop() {


  for(int i=0; i<4; i++)
  {
     int  val = digitalRead(pushButton[i]);   
    if(val == HIGH && relayStatus[i] == LOW){
  
      pushed[i] = 1-pushed[i];
      delay(100);
    }// if   

  relayStatus[i] = val;

      if(pushed[i] == HIGH){
        Serial.print(relayNames[i]);
        Serial.println(" ON");
        digitalWrite(relayPin[i], LOW); 
       
      }else{
        Serial.print(relayNames[i]);
        Serial.println(" OFF");
        digitalWrite(relayPin[i], HIGH);
   
      }// else   
 
  }// for 
    Serial.println("=="); 
  delay(100);

}// loop end

ik heb de code in arduino ide programma bijgevoegd de simulatie doe ik in tinkercad

switchCase.ino (1.21 KB)

primabegin hoor.
je hebt dus een array met pushed[] klaar staan.
if pushed [1] dan relais1 aan en relais 2 en relais 3 uitzetten
en zo kun je dat dus voor alle drukknoppen.
je kunt overigens ook if (digitalRead(pinin)) zet relais aan en andere uit
dan heb je dus maar 3 regels code om te beginnen lekker simpel om te beginnen.

hartelijk dank voor u antwoord maar zou je dat een beetje willen toelichten hoe ik dat exact doe ?? ik ben nog zover niet in de lessen en heb het wel vrij dringend nodig ik probeer al een tijdje de lessen van bass on tech en af en toe copieer ik wel is iets van arduinio projects ( ik ben dol op flitsende dingen )
:slight_smile:

deze code is geschreven door men opa maar de man is helaas overleden en ik ben nog niet mee met alles in deze code , ik begrijp wel een beetje ervan maar echt niet alles ik zie ook niet goed vanwaar die pull up komt .

wel om eerlijk te zijn ben ik er geraakt met een gans andere code , ja ik heb afgekeken maar ze zelf met de serial monitor in low and high aangepast , op zich kan dit ook en ik heb vooral in het voorbeeld goed de commentaren gevolgd en ik heb nu maar 1 drukknop nodig ; toch is dat met die ! nieuw en ben ik nog niet goed mee wat hierdoor veranderd ik vermoed iets met de + en de - in doorschakeling maar ik ben niet 100% zeker

sorry ik heb echter dit enkel in het engels gevonden

nu please help me even ik wil dat de 4de relais dus pin 12 een on/off functie krijgt maar met een aparte drukknop kan dit nog en moet ik nu rekening houden met die ! in die code please geef een vb hoe i kdit het simpelste doe ; stap voor stap leer ik wel.

o ja in deze schakeling zit de + met een weerstandje aan de drukknop maar dat staat dus ook ter refferentie

hieronder mijn code

/*
   State change detection (edge detection)

  Often, you don't need to know the state of a digital input all the time,
  but you just need to know when the input changes from one state to another.
  For example, you want to know when a button goes from OFF to ON.  This is called
  state change detection, or edge detection.

  This example shows how to detect when a button or button changes from off to on
  and on to off.

  The circuit:
  * pushbutton attached to pin 2 from +5V
  * 10K resistor attached to pin 2 from ground >> pulldown resistor
  * LED attached from pin 13 to ground (or use the built-in LED on
    most Arduino boards)

  created  27 Sep 2005
  modified 30 Aug 2011
  by Tom Igoe

 This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ButtonStateChange

  */

// this constant won't change:
 const int  buttonPin = 2;    // the pin that the pushbutton is attached to
 const int ledPin1 = 9;       // the pin that the LED is attached to
 const int ledPin2 = 10;       // added
 const int ledPin3 = 11;       // added
// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
   // initialize the button pin as a input:
   pinMode(buttonPin, INPUT);
   // initialize the LED as an output:
   pinMode(ledPin1, OUTPUT);
   pinMode(ledPin2, OUTPUT); //added
   pinMode(ledPin3, OUTPUT); //added
   // initialize serial communication:
   Serial.begin(9600);
}


void loop() {
   // read the pushbutton input pin:
   buttonState = digitalRead(buttonPin);

   // compare the buttonState to its previous state
   if (buttonState != lastButtonState) {
     // if the state has changed, increment the counter
     if (buttonState == HIGH) {
       // if the current state is HIGH then the button
       // wend from off to on:
       buttonPushCounter++;
       Serial.println("on");
       Serial.print("number of button pushes:  ");
       Serial.println(buttonPushCounter);
     } else {
       // if the current state is LOW then the button
       // wend from on to off:
       Serial.println("off");
     }
     // Delay a little bit to avoid bouncing
     delay(50);
   }
   // save the current state as the last state,
   //for next time through the loop
   lastButtonState = buttonState;


   // turns on the LED every four button pushes by
   // checking the modulo of the button push counter.
   // the modulo function gives you the remainder of
   // the division of two numbers:

   //added
   if (buttonPushCounter == 1) {
     digitalWrite(ledPin1, LOW);
     digitalWrite(ledPin2, HIGH);
     digitalWrite(ledPin3, HIGH);
   } else if (buttonPushCounter == 2) {
     digitalWrite(ledPin1, HIGH);
     digitalWrite(ledPin2, HIGH);
     digitalWrite(ledPin3, LOW);
   } else if (buttonPushCounter == 3) {
     digitalWrite(ledPin1, LOW);
     digitalWrite(ledPin2, HIGH);
     digitalWrite(ledPin3, HIGH);
   }else {
     digitalWrite(ledPin1, HIGH);
     digitalWrite(ledPin2, HIGH);
     digitalWrite(ledPin3, HIGH);
     buttonPushCounter =0;
   }

}

De ! betekent NOT, dus niet.
Een bit dat !1 is, is niet 1 en dus nul.

Wanneer je een waarde hebt die je wil veranderen zonder dat je per se bij hoeft te houden of ie dan een 1 of een 0 is, kun je op die wijze veranderen.
Dus waarde = !waarde laat waarde van een 0 naar een 1 veranderen of van een 1 naar een 0.

Als je een ander soort variabele hebt en je gaat die vergelijken, dan kun je wel in de knoop gerakenwanneer je dat niet helemaal juist uitvoert.
Want een waarde van 54 is niet een waarde van 3, maar ook niet een waarde van 75.
En dus kun je niet betrouwbaar op die wijze werken (en wanneer je dat zou proberen, gebeurt er ook iets heel anders dan je zou verwachten).

Maar goed, het uitroepteken komt maar 1 keer voor, namelijk in de vorm van !=.
Dat betekent dus dat je kijkt of iets NIET gelijk is aan iets anders.
Dus wanneer de knop net niet was ingedrukt, maar nu wel, dan is de voorwaarde waar, en kan de code tussen de {} haakjes worden uitgevoerd.
Maar ook wanneer de knop net wel was ingedrukt maar nu niet meer, kan dat gedaan worden.
In die code kijk je tussen de {} dan nog een keer wat de huidige (dus nieuwe) waarde van de knop ook al weer was.

hou het simpel en begrijpbaar voor jezelf, dan leer je het makkelijkst, en als je copieert prima daar leer je ook mee, maar schrijf er wel je eigen commentaar bij, dan leer je het snelst en proberen man, lekker spelen.