Hulp bij programmeren van Besturing van electra in huis & Brandweerpieper

Beste forumleden.

Ik ben begonnen met een projectje een tijdje geleden.
http://forum.arduino.cc/index.php?topic=171900.msg1277509#msg1277509
Nu wil ik hem uit gaan bereiden. en heb daarvoor de nodige spulletjes gekocht en gevonden.
Wil het een beetje rustig aan doen maar loop nu al vast.

Spulletjes die ik heb zijn.

Arduino Mega (in de toekomst 2 een voor mijn TFT scherm)
Arduino Uno
Arduino Wifi shield

8 Kanaals relaisblok

Arduino Mega Shield v2.0 per LCD TFT01 (Arduino, Raspberry, DIY, Robot) //Shield voor TFT Scherm
7" 7 Inch TFT LCD Display Module Font IC 800x480 //TFT Schermpje

WT5001M02-28P //Sound Module
PAM8403 5V Digital Amplifier Board USB Power Supply //Amplifier

Wat is mijn project.

Ik zit bij de brandweer en wil graag dat mijn lichten automatisch aangaan. dat is allemaal gelukt. Alleen zou nu ook mijn lichten aan en uit willen doen via de ipad, Iphone of Android telefoon dit via de wifi module ook wil ik daar in de toekomst temperatuur etc op kunnen zien. nou dacht ik, ik ga niet meteen beginnen met die stap naar een webserver, maar eerst eens beginnen met drukknopjes op een breadboord, dat heb ik geprobeerd maar dat lukt me dus niet helaas. omdat hij dan niet meer afgaat als er alarm is.

dit is mijn code waar ik tot nu toe ben zonder lichten aan en uit.
lichten worden gekoppeld aan het relay met uitgang 1, 2, 3, 4, 5, 6, 7 & 8 dit is in de I/O 22, 23, 24, 25, 26, 27, 28, 29

het probleem waar ik natuurlijk tegenaan ga lopen is wanneer mijn pieper afgaat en de lichten zijn aan moeten de lampen niet uitgaan nadat de call voorbij is. maar als de lichten niet aanstaan mogen ze wel uit natuurlijk.

//librarys
#include <relay8.h>

//Pager Circuit
const int ledOn = 13;                                                                                             //Green led for visible on
const int LED_C = 12;                                                                                             //Relay_8 for switching the light on and after delay off

const int Button_1 = 37;                                                                                          //Button <  Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb
const int Button_2 = 38;                                                                                          //Button >  Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb
const int Button_3 = 39;                                                                                          //Button || Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb
const int Button_4 = 40;                                                                                          //Button (') Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb

const int Opto_Pager = 51;                                                                                       //Pager with Optocoupler
const int Opto_1 = 41;                                                                                            //Optocoupler <  Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb
const int Opto_2 = 42;                                                                                            //Optocoupler >  Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb
const int Opto_3 = 43;                                                                                            //Optocoupler || Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb
const int Opto_4 = 44;                                                                                            //Optocoupler (') Dit zijn knoppen die op mijn pieper zitten die ik verbouwd heb
relay8  relay(22, 23, 24, 25, 26, 27, 28, 29);
                             
void setup() {
  Serial1.begin(9600); 
  pinMode(ledOn, OUTPUT);
  pinMode(Opto_1, OUTPUT);
  pinMode(Opto_2, OUTPUT);
  pinMode(Opto_3, OUTPUT);
  pinMode(Opto_4, OUTPUT);
  pinMode(LED_C, OUTPUT);

  pinMode(Opto_Pager, INPUT);
  pinMode(Button_1, INPUT);
  pinMode(Button_2, INPUT);
  pinMode(Button_3, INPUT);
  pinMode(Button_4, INPUT);
 
                                           
  Serial1.write(0x7E);
  Serial1.write(0x03);
  Serial1.write(0xA7);
  Serial1.write(0x1F); //  volume max
  Serial1.write(0x7E);

  //start sound
  Serial1.write(0x7E);
  Serial1.write(0x04);
  Serial1.write(0xA0); // A0 for SD card
  Serial1.write((byte)0x00);
  Serial1.write(0x02); // track number
  Serial1.write(0x7E);
  delay(3000);
  digitalWrite(ledOn, HIGH);
  relay.on(1);
  relay.on(2);
  WaitForCall();
}

void loop() {
 
}

void WaitForCall()
{
  while (true){
    int val = digitalRead(Opto_Pager);
    if (val == HIGH)
     {           
      digitalWrite(LED_C, HIGH);


      Serial1.write(0x7E);
      Serial1.write(0x03);
      Serial1.write(0xA7);
      Serial1.write(0x1F);                                                                                       //Volume Max.
      Serial1.write(0x7E);
      delay(10);
      Serial1.write(0x7E);
      Serial1.write(0x04);
      Serial1.write(0xA0);                                                                                       //A0 for SD card
      Serial1.write((byte)0x00);
      Serial1.write(0x01);                                                                                       //Track number
      Serial1.write(0x7E);
      delay(300);
      digitalWrite(Opto_4, HIGH);                                                                           //Button on Pager "High"
      delay(5);                                                                                                   //Short Delay
      digitalWrite(Opto_4, LOW);                                                                           //Button on Pager "Low"                                                                                                     
      RelaysOn();                                                                                               //Relays On When Pager is on.
     
    }
  }
}

void CallDone()
{
 
  digitalWrite(LED_C, LOW);
  while(true)
  {
    int val = digitalRead(Opto_Pager);
    if (val == LOW) {   
      WaitForCall();
    }
  }
}
void RelaysOn()
{

  for (int t=0; t<3; t++)
  {

    relay.off(1);                                                                     \\Raar maar waar Off is aan
    relay.off(2);                                                                     \\Raar maar waar Off is aan
    delay(10000);
    relay.on(1);                                                                      \\Raar maar waar On is uit
    relay.on(2);                                                                      \\Raar maar waar On is uit
    delay(5);
    CallDone();
  }
}

Bedankt voor het Helpen alvast

MVG Jeroen

PS heb deze vraag ook gesteld op Arduinoforum.nl
http://arduinoforum.nl/viewtopic.php?f=25&t=737&p=4837#p4837

Ik heb je sketch en je oude opzet niet gelezen.
Maar ik denk wel dat ik weet wat je moet doen om dit voor mekaar te krijgen.

Als je zelf het licht aan doet, dan ga je meestal niet nog eens terug om het licht weer aan te doen, en als het uit was ga je ook niet terug om m nog een keer uit te doen.
Dat is omdat je hebt onthouden of je 'm aan of uit gezet hebt.
Dus moet je je Arduino ook laten onthouden hoe de stand van zaken was voor je je melding kreeg.
Dan kun je dus heel eenvoudig weer terug keren naar die toestand.
Dat betekent dus dat je een vorigeStatus (lastState) moet bijhouden.
Aangezien je (denk ik) alles aanzet als je een melding krijgt, hoef je niet te onthouden dat je alles aan hebt staan, maar alleen dat de melding nog geldig is.
Ik zou het ook zo maken dat ik maar 1 keer alles aan zou zetten, en niet telkens weer tijdens je melding alles aanzetten terwijl dat al zo was (scheelt je tijd).

Nog een keer in het kort:
Goed bijhouden wat je allemaal doet en gedaan hebt.

Kun jij mij misschien een voorbeeld geven van last state?

ik ben zelfs nog een stapje daarvoor want krijg het al niet werkend om mijn lichten aan te doen. maar dat wel de wait for call actief blijft.

ik wil wel alles apart schakelen reden is dat ik dan kan zeggen dat het nachtlampje van mijn vriendin niet aangaat. dat doe ik in de sketch relaison omdat ik dan kan kijken wat ik aan wil hebben.

Ik heb evenb door je sketch gelopen maar loop je niet de kans dat je eindeloos routine binnen routine doorloopt?

waitForCall()->RelaysOn()->CallDone()->waitforCall()

Daarvan gaat je geheugen een keer vollopen vanwege de stack.

Hoi Roeijoen en nicoverduin.

LastState en currentState werken precies hetzelfde als previousMillis en currentMillis , de vrienden uit het 'blink without delay' voorbeeld.
Dus als je die nog eens doorspit, zie je dat verband wellicht.
Ik denk dat dat het beste voorbeeld is.

Nico:
Dat lijkt me een terechte conclusie.
Maar kun je dat voor de beginnende Arduinist© misschien nog wat toelichten ?
Ik betrapte mezelf op de neiging achter de oren te gaan krabben toen ik m net las, en moest het antwoord ff twee keer lezen.

Beste nico en Mas,

@Nico. ik zal even uitleggen wat er gebeurd, wanneer ik de arduino opstart gaat hij z'n setup doen en eindigt in Void wait for call.
op het moment dat mijn pieper gaat geeft mijn pieper een stroompje door naar een optocoupler die ik daarna heb aan gesloten op een digitale ingang. deze zet dan de wait for call in werking. die activeert de geluidsmodule en en daarna doorgaat om mijn relais die verbonden zijn met het stopcontact aan te zetten. als de relais aan hebben gestaan gaan ze uit via calldone en gaat alles weer terug naar wait for call. dit is dus de oneindige loop. Waardoor ik geheel vast zit aan dat programmatje.
Ik wilde namelijk kijken of ik via een of andere manier toch mijn lichten in huis kan aanzetten maar dat wel die sketch die ik nu heb blijft draaien maar dat krijg ik niet voor elkaar.

kan jij mij ook uitleggen hoe mijn stack vol kan lopen?

@Mas ik ga eens even kijken hoe dat werkt. Ik ben inderdaad een beginnende Arduinist. dacht ik begin redelijk simpel door een sketch te maken met mijn pieper, alleen merk nu al door te weinig verstand loop dat nu helemaal vast door dat ik zelf een loop heb gecreeerd.

Bedankt iedergeval voor jullie adviezen

Je roept een functie aan binnen een functie binnen een functie binnen een functie etcetc en komt eigenlijk nooit tot het einde van die functie.
Als je een functie aanroept wordt er een zgn. return adress en mogelijk return variabele op de stack geplaatst. Tevens worden er locale variabelen op de stack gegooid. De stack zit in het RAM geheugen Als je dit eindeloos doet is de pot op een gegeven moment leeg. Idem met interrupts als je binnen een interrupt interrupts weer mogelijk maak, kan je de hele zaak laten 'hangen'.