Trapverlichting

Arduino specifieke Software
Berichten: 12
Geregistreerd: 05 Mei 2017, 11:51

Re: Trapverlichting

Berichtdoor Hazet » 09 Mei 2017, 20:13

Met de code die ik nu heb werkt het geheel zoals het moet werken, alleen de leds gaan niet uit als de eerste PIR wordt geschakeld en de andere niet. Bijvoorbeeld als je besluit om toch niet naar boven te gaan.

Ik zal een tekening maken van hetgeen ik nu heb aangesloten.
Ik ga me ook eerst verdiepen in het waarheidstabel en kom hier op terug.

Bedankt.

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Trapverlichting

Berichtdoor Koepel » 09 Mei 2017, 21:13

Ik bedoelde een tekening van de structuur van de logica voor de code. Software dus.
Als de hardware werkt, dan neem ik aan dat het goed is.

Het gaat dus alleen maar om al die if-statements te vervangen door iets dat wel duidelijk en logisch in elkaar zit. Als dat op een normale en logische manier gemaakt wordt, dan is het mogelijk om dingen te wijzigen of toe te voegen (zoals een timeout om de leds uit te zetten).

Maak een filmpje, spreek het in, schrijf het op, teken het uit. Alles mag. Wanneer de bedoeling duidelijk is, dan kan het omgezet worden in code.

Berichten: 12
Geregistreerd: 05 Mei 2017, 11:51

Re: Trapverlichting

Berichtdoor Hazet » 10 Mei 2017, 20:51

Zoals in het filmpje te zien is wordt de onderste PIR (input 3) geactiveerd en daarna gaan de leds een voor een branden met 25 ms delay.
Als je boven komt wordt de bovenste PIR ( input 2) geactiveerd en gaan de leds een voor een uit met 50 ms delay.
Kom je van boven dan is de sequence andersom.

Wat nog ontbreekt is dat de leds uitgaan na een beplaalde tijd als men besluit om toch niet naar boven te gaan of andersom.

Ik heb het filmpje proberen te uploaden, maar dat lukte niet daarom hieronder de url voor het filmpje.


https://www.dropbox.com/s/hvfumgu042eaetz/Bestand%2010-05-17%2011%2043%2022.mov?dl=0

Alvast bedankt.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Trapverlichting

Berichtdoor Koepel » 11 Mei 2017, 00:58

Met een filmpje bedoelde ik ook een beschrijving van de structuur van de logica voor de code. Maar het is wel een duidelijk en een leuk fimpje. Je hebt de draden mooi weggewerkt.

Dit is wat ik bedoelde, dat is een beschrijving:
Zoals in het filmpje te zien is wordt de onderste PIR (input 3) geactiveerd en daarna gaan de leds een voor een branden met 25 ms delay.
Als je boven komt wordt de bovenste PIR ( input 2) geactiveerd en gaan de leds een voor een uit met 50 ms delay.
Kom je van boven dan is de sequence andersom.

Wat nog ontbreekt is dat de leds uitgaan na een beplaalde tijd als men besluit om toch niet naar boven te gaan of andersom.


Kun je dat uitbreiden ?
Hoeveel led strips zijn er ? Dan is de totale tijd bekent waarbij de Arduino in een delay bezig is.
Is het goed dat er niet naar sensors wordt gekeken terwijl ze bezig zijn om aan of uit te gaan ?
Na hoeveel tijd wil je dat de leds uitgaan ?
Gaan de leds meteen uit, of wil je datzelfde verloop, of misschien dimmen en zachtjes uitgaan.
Wat als beide PIR sensor op hetzelfde moment aktief worden ?
Kijk je of een PIR sensor aktief is, of alleen naar het moment dat de sensor van niet-aktief naar aktief gaat ?

De volgende stap is het omzetten naar code.
Laten we die twee variabelen aanhouden die je al hebt. Twee boolean variabelen.
Dat de leds aan en uit gaan op de overgangen van de code, dat is bijzaak. Het belangrijkste is dat de logica klopt.
In rust zijn beide variabelen false.
Dus als een sensor aktief wordt dan wordt er eentje true, en dan wordt meteen de tijdvertraging gestart.
De andere sensor zet de sketch weer in rust.
De andere sensor zet voor de zekerheid ook de tijdvertraging uit.
Zie je dit al een beetje voor je ?

Berichten: 12
Geregistreerd: 05 Mei 2017, 11:51

Re: Trapverlichting

Berichtdoor Hazet » 11 Mei 2017, 15:42

Hoeveel led strips zijn er ? Dan is de totale tijd bekent waarbij de Arduino in een delay bezig is.

--- Er zijn 14 strips op de PWM shield aangesloten.

Is het goed dat er niet naar sensors wordt gekeken terwijl ze bezig zijn om aan of uit te gaan ?

--Zo druk is het niet op de trap, dus de sensors worden alleen als triggers gebruikt. Dus als de leds uitgaan terwijl de sensor geactiveerd wordt dan is het niet erg dat de ledsequence doorgaan.


Na hoeveel tijd wil je dat de leds uitgaan ?

-- Ik denk dat een seconde of 10 (10000 ms) wel voldoende is.

Gaan de leds meteen uit, of wil je datzelfde verloop, of misschien dimmen en zachtjes uitgaan.

-- Het zelfde verloop van boven naar beneden en andersom zou fijn zijn. Faden is weer ingewikkelder denk ik, dus dat komt wel als ik de materie beter begrijp.
Wat als beide PIR sensor op hetzelfde moment aktief worden ?

-- Dan is het niet erg dat de eerste die de input geeft de sequence bepaald.


Kijk je of een PIR sensor aktief is, of alleen naar het moment dat de sensor van niet-aktief naar aktief gaat ?

Alleen het moment true/false.

Heeft de pwm shield PCA9685 nog invloed op de code?
In de code die ik heb wordt ook meegenomen. Daar veranderd niets neem ik aan? De setupinstructies blijft hetzelfde toch?

Ik snap jouw verhaal heel goed, maar het vertalen naar de code blijft lastig om op papier te zetten.

Bedankt.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Trapverlichting

Berichtdoor Koepel » 12 Mei 2017, 08:04

Om een programma te maken is het belangrijk om de echte wereld goed te beschrijven. Dat vind ik nog niet helemaal geslaagd :?
Het zou fijn zijn als je een mooie strakke beschrijving kunt maken.

Je kunt dit bovenin je sketch zetten:
Code: Alles selecteren
// -----------------------
// Beschrijving
// -----------------------
//
// Zoals in het filmpje te zien is wordt de onderste PIR (input 3) geactiveerd
// en daarna gaan de leds een voor een branden met 25 ms delay.
// Als je boven komt wordt de bovenste PIR ( input 2) geactiveerd
// en gaan de leds een voor een uit met 50 ms delay.
// Kom je van boven dan is de sequence andersom.
//
// Wat nog ontbreekt is dat de leds uitgaan na een beplaalde tijd als men besluit
// om toch niet naar boven te gaan of andersom.
//
// Hoeveel led strips zijn er ? Dan is de totale tijd bekent
// waarbij de Arduino in een delay bezig is.
//
// --- Er zijn 14 strips op de PWM shield aangesloten.
//
// Is het goed dat er niet naar sensors wordt gekeken terwijl ze bezig zijn
// om aan of uit te gaan ?
//
// --Zo druk is het niet op de trap, dus de sensors worden alleen als triggers gebruikt.
// Dus als de leds uitgaan terwijl de sensor geactiveerd wordt
// dan is het niet erg dat de ledsequence doorgaan.
//
//
// Na hoeveel tijd wil je dat de leds uitgaan ?
//
// -- Ik denk dat een seconde of 10 (10000 ms) wel voldoende is.
//
// Gaan de leds meteen uit, of wil je datzelfde verloop, of misschien dimmen
// en zachtjes uitgaan.
//
// -- Het zelfde verloop van boven naar beneden en andersom zou fijn zijn.
// Faden is weer ingewikkelder denk ik, dus dat komt wel als ik de materie beter begrijp.
// Wat als beide PIR sensor op hetzelfde moment aktief worden ?
//
// -- Dan is het niet erg dat de eerste die de input geeft de sequence bepaald.
//
//
// Kijk je of een PIR sensor aktief is, of alleen naar het moment dat
// de sensor van niet-aktief naar aktief gaat ?
//
// Alleen het moment true/false.
//


Of je doet dit :o
Code: Alles selecteren
// Beschrijving: http://arduinoforum.nl/viewtopic.php?f=8&t=2523


Om de logica van de code duidelijk te maken kun je een waarheidstabel maken, of een tekening van de structuur van de code. Maar dat is misschien lastig als je dat niet gewend bent, en ik zie de code al voor me op grijpbare afstand. Misschien dat nicoverduin het ons vergeeft dat we dat overslaan :mrgreen:

Wanneer ik de indeling voor je maak van de code, dan bestaat het gevaar dat jij het niet ziet en dat je niets meer met de code kunt doen. Dat is helaas regelmatig zo, en dat is waarom de meeste zo terughoudend zijn om een volledige sketch te geven.
Dus hieronder geef ik de losse brokken om de indeling duidelijk te maken, en ik hoop dat jij begrijpt waarom het dit geworden is.

Vind je het goed om mijn idee te doen en de sketch op te delen op deze manier ? Dat vind ik zelf gemakkelijk. De drie losse onderdelen kunnen in elkaar verweven worden, maar ik hou er van om het uit elkaar te halen.
Code: Alles selecteren
void loop()
{
  // ----------------------------
  // Verzamelen alle gegevens
  // ----------------------------

  // ----------------------------
  // Verwerk de gegevens
  // ----------------------------

  // ----------------------------
  // Handel de tijdvertraging af
  // ----------------------------
}


Dus eerst alle gegevens verzamelen. Dan zou ik graag een StateChangeDetection op beide PIR sensors willen hebben.
https://www.arduino.cc/en/Tutorial/StateChangeDetection
Voor de namen heb ik dat voorbeeld gevolgd.
Kun je dit twee keer maken voor beide PIR sensors ?
Code: Alles selecteren
const int pirBenedenPin = 3;
int lastPirBenedenState = LOW;   // default niet aktief, dus LOW

void setup()
{
  pinMode( pirBenedenPin, INPUT);
  ...

void loop()
{
  // De lokale variabele pinBeneden is om binnen de loop() aan het tweede deel
  // door te geven dat een PIR sensor aktief is geworden.
  boolean pirBeneden = false;    // default niet aktief, dus false

  // ----------------------------
  // Verzamelen alle gegevens
  // ----------------------------
  int pirBenedenState = digitalRead( pinBenedenPin);
  if ( pirBenedenState != lastPirBenedenState)
  {
    if( pirBenedenState == HIGH)
    {
      // De PIR beneden is gewijzigd en is zojuist  aktief geworden.
      // Zet een variabele om door te sturen naar het verwerken van de gegevens.
      pirBeneden = true;
    }
    lastPinBenedenState = pirBenedenState;   // onthoudt de nieuwe state
  }
}


Dan het verwerken van de gegevens. Het belangrijkste is dat er drie toestanden zijn. Dus dat wordt de hoofdindeling.
De toestand waarbij omhoog wordt gegaan noem ik "goingUp". Ik zit nu wel Nederlands en Engels door elkaar te gooien, dus maak er gerust betere namen van.
Code: Alles selecteren
boolean goingUp = false;
boolean goingDown = false;

void loop()
{
  ...

  // ----------------------------
  // Verwerk de gegevens
  // ----------------------------
  if ( goingUp )
  {
    // Wachten op de PIR boven
    if ( pirBoven )
    {
       // Zet de leds uit voor omhoog gaand

       // Stop de timer

       goingUp = false;         // terug naar rust toestand
    }
  }
  else if ( goingDown )
  {
    // Wachten op de PIR beneden
    if ( pirBeneden )
    {
       // Zet de leds uit voor omlaag gaand

       // Stop de timer

       goingDown = false;         // terug naar rust toestand
    }
  }
  else
  {
    // alles is in rust, we wachten op een PIR sensor.
    if ( pirBeneden )
    {
      // De PIR beneden werd geaktiveerd, dus omhooggaand wordt aktief.
      goingUp = true;

      // Zet leds aan voor omhoog gaand

      // Start een timer
    }
    else if ( pirBoven )  // hier een "else if" zodat ze niet allebei aktief worden.
    {
      // De PIR boven werd geaktiveerd, dus omlaaggaand wordt aktief.
      goingDown = true;

      // Zet leds aan voor omlaag gaand

      // Start een timer
    }
    else
    {
      // niets te doen, alles is in rust.
    }
  }


Op die manier valt de logica op zijn plaats. Stel dat je iets wilt toevoegen als de PIR beneden opnieuw aktief wordt, terwijl op dat moment "naar boven gaand" bezig is. Dat zou je dat eenvoudig in de code moeten kunnen vinden.

Ik denk dat één software timer (tijdvertraging) voldoende is om alles uit te zetten. Dat heb ik al eerder aangegeven hoe dat te doen.
Code: Alles selecteren
unsigned long previousMillis;
boolean enableDelay = false;

void setup()
  ...

void loop()
{
  ...
       // Stop de timer
       enableDelay = false;
  ...
      // Start een timer
      previousMillis = millis();    // timestamp this moment.
      enableDelay = true;  // enable this software timer.
  ...


  // ----------------------------
  // Handel de tijdvertraging af
  // ----------------------------
  if( enableDelay)   // delay active ?
  {
    if( millis() - previousMillis >= 10000UL)   // 'UL' means Unsigned Long
    {
      enableDelay = false;   // disable this software timer

      // Zet alle led uit.

      // Er is er maar eentje aktief, maar gewoon beide uit zetten.
      goingUp = false;
      goingDown = false;

      // Alles is nu terug gezet naar rust toestand.
    }
  }
}


Volgens mij is er dan nog een functie nodig om de leds uit te zetten nadat de tijdvertraging is afgelopen. Als alles werkt kun je het uitzetten misschien mooier maken, maar probeer eerst om het werkend te krijgen.
De PCA9685 heb ik nog niet naar gekeken. Het ging mij eerst om die onduidelijkheid van de if-statements te vervangen door iets dat logisch in elkaar zit.
De hoofdindeling met 'goingUp' en 'goingDown' en 'in rust' en 'tijdvertraging', dat is eenvoudig om te zetten naar "state machine" code. Dat doe ik nog niet, maar eigenlijk zit dat er al in verborgen ;)

Berichten: 12
Geregistreerd: 05 Mei 2017, 11:51

Re: Trapverlichting

Berichtdoor Hazet » 12 Mei 2017, 20:39

Dank je voor al het werk dat je verzet hebt.
Ik ga alles uitprinten en bekijken of ik eruit kom.
Nogmaal dank voor de moeite en ik meld me weer als het hopelijk werkt.

Mvg

Gebruikers-avatar
Berichten: 35
Geregistreerd: 13 Okt 2016, 21:17

Re: Trapverlichting

Berichtdoor PA9CW » 14 Mei 2017, 14:37

Leuk idee, zo'n trapverlichting. Zeker met zo'n filmpje erbij.

Berichten: 12
Geregistreerd: 05 Mei 2017, 11:51

Re: Trapverlichting

Berichtdoor Hazet » 17 Mei 2017, 09:16

@PA9CW
Dank je wel, alleen nu met de hulp van Koepel het geheel nog beter werkend krijgen.

Berichten: 12
Geregistreerd: 05 Mei 2017, 11:51

Re: Trapverlichting

Berichtdoor Hazet » 19 Mei 2017, 19:43

@Koepel
Ik kom er toch niet uit. Ondanks jouw hulp loop ik elke keer vast. Ik weet echt niet hoe ik de code op moet bouwen. :?:
Grt

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 22 gasten