Impulsschakeling

Dag mensen,

Vooreerst mijn naam is Ivan, en ben starter in Arduino.
Met mijn leeftijd weet ik waar de mosterd vandaan komt.

Hoe dan ook, ik zit met een vraag:

Ik zou graag, in het kader van domotica, een impuls relais software matig opzetten:
Ik druk op een drukknop en mijn belasting (lamp, stopcontact, ...) gaat aan.
Ik laat de drukknop los, de belasting blijft aan.
Ik druk nogmaals op de drukknop, en mijn lamp gaat uit.

De lamp zou gestuurd worden via een solidstate relais.
Dus ik wel geen fysische of mechanische zaken meer...

Dit was mijn code:

// Pin 13 has an LED connected on most Arduino boards.
int led = 13;
// in test I want to use input 34.
int input_IO = 34;
// Variable to use in impuls switch
int knop1_nieuw;
int knop1_oud;
 
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);    
 // initialize the digital pin as an input. 
  pinMode(input_IO, INPUT); 
   Serial.begin(9600); 
}
 
// the loop routine runs over and over again forever:
void loop() 
{
 
  knop1_nieuw = input_IO;
      if ((knop1_nieuw != knop1_oud) && knop1_nieuw)
          {
          led = 1;
          }
      else
          {
          led = 0;
          }
      knop1_oud = knop1_nieuw;
  digitalWrite(led,digitalRead(input_IO));
 
}

Alvast bedankt om dit even na te zien.

Ivan

Ivan
Welkom op het Arduino forum.

Ik begr?p je opzet niet goed. Als je een solid state relais gebruikt heb je toch geen Arduino nodig? De impuls rechtstreeks op het relais en klaar.
Of mis ik iets?
Met vriendelijke groet
Jantje

Hallo Jantje,

Voor zover ik weet zou een solid state relais enkel schakelen.

Wanneer de optocoupler geleidt dan geleidt de triac ook.
Is optocoupler gesperd dan is ook de triac gesperd.

Hier is de volledige uitleg van de betreffende schakeling.
Deze schakelingen stop ik in een stekker, en schakel daar dan de belasting aan.

Of zie ik iets verkeerd?

ps. Bijna vergeten, bedankt voor je repley, Jantje

Ivan
Sorry voor de verwarring. Had ik bistabiel en solid state door elkaar gehaald.
Als ik naar je code kijk zou ik vermoeden dat je dit wilt (maar ik kan er naast zitten :wink: )

// Pin 13 has an LED connected on most Arduino boards.
#define led  13
// in test I want to use input 34.
#define input_IO  34

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);    
 // initialize the digital pin as an input. 
  pinMode(input_IO, INPUT); 
}
 
// the loop routine runs over and over again forever:
void loop() 
{
  digitalWrite(led,digitalRead(input_IO));
 delay(100); //as a quick debounce solution but a real debounce would be better
}

Verder deze bedenking
Input IO 34? Heb je een mega?
En wegens de led en weerstand op pin 13 kan je beter een andere pin gebruiken om je solid state relais aan te schakelen.
Met vriendelijke groet
Jantje

oesp
Ik zit nog altijd met bistabiel in men hoofd. De andere opmerkingen blijven geldig.

// Pin 13 has an LED connected on most Arduino boards.
#define led  13
// in test I want to use input 34.
#define input_IO  34

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);    
 // initialize the digital pin as an input. 
  pinMode(input_IO, INPUT); 
}
 
// the loop routine runs over and over again forever:
void loop() 
{
  static byte buttonState=LOW;
  static byte releasState =LOW;
  byte newButtonState=digitalRead(input_IO);
  if (newButtonState != buttonState)
     {
        if (buttonState=HIGH)
           {
              releasState=!releasState;
            }
        buttonState=!buttonState;
     }
  digitalWrite(led,releasState);
 delay(100); //as a quick debounce solution but a real debounce would be better
}

Ik heb inderdaad een 256 Arduino.

Uiteraard is pin 13 eigenlijk voor de "test".

Uiteindelijk zou ik de oneven pinnen als ingang gebruiken en de even pinnen als uitgang.
Staat makkelijk op de print van Arduino256 ....

Ik dank je en test de schakeling direct uit.
(Pas thuis, vanwege een fotografie cursus)

Wanneer knop 34 op "nul" staat dan kan ik (mits de delay(100) indachtig te zijn, gebruik maken van de schakeling.
Komt knop34 in de "een" stand, dan blijft mijn led knipperen aan een snelheid van delay(100)

Het is dus best een beetje willekeurig dat de uitgang werkt.

Het lijkt me dus erg moeilijk?

Zoiets dan?

int reading = digitalRead(knop);
  if (reading != lastButtonState)
   { lastDebounceTime = millis();}
  if ((millis() - lastDebounceTime) > debounceDelay)
   {buttonState = reading;}
   lastButtonState = reading;
  
  if (buttonState == false)    //button is pressed
    {if (toggleReading == false)
     {toggleReading = true; 
     if (toggleState == false) {toggleState = true; }
     else {toggleState = false;}}
   Pressed = toggleState;}

if (Pressed == true && ledState == true) {ledState = false;}
if (Pressed == true && ledState == false) {ledState = true;}

digitalWrite (led,ledState);
Pressed = false;

heb je een pull down weerstand gebruikt?
Met vriendelijke groet
Jantje

ello,
Nog even de draad oppikken...

Nadat ik hierachter het internet heb afgedweild kom ik nogmaals vragen hoe ik een impulsschakeling software matig kan maken?

heb je een pull down (of up) weerstand gebruikt?
Met vriendelijke groet
Jantje

Dat kan toch nooit zo ingewikkeld zijn ?

Je moet goed bijhouden wat er allemaal gebeurt.
Daarvoor heb je waarschijnlijk een paar extra variabelen nodig, zoals een die bijhoudt hoe het nu is, en een andere die bijhoud hoe het net was.
Het lijkt er sterk op dat je dat nu niet doet.
Daarom kan het slim zijn er een stuk papier bij te pakken en daarop aantekeningen te maken en een flow diagram te maken.
Dat maakt het veel gemakkelijker om je probleem op te lossen.
Maak ook nu een stukje code dat alleen dat doet wat je nu wil bereiken en laat alle andere zaken die je met je project wil doen nu even voor wat het is.
Dan kun je het later als het werkt zoals je wil weer samenvoegen met je project.
En gooi de delay functie overboord, zeker als je meer dingen wil doen.
Je kunt op een veel intelligenter wijze hetzelfde bereiken en daarmee voorkomen dat alles even stopt (want dat doet delay dus).
100 ms is een halve eeuwigheid.
Die veel intelligenter wijze heeft rikky je al laten zien en de "blink without delay" sketch laat je zien hoe dat werkt.

Als je een code gemaakt hebt die werkt maar niet helemaal, dan kun je die (middels de [ code ] tag, het # knopje in de editor hier) posten en kan er commentaar op gegeven worden.