Trapverlichting

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

Trapverlichting

Berichtdoor Hazet » 05 Mei 2017, 12:21

Hallo,

Ik heb een projectje trapverlichting afgerond, maar ik zit nog met een probleempje.
Als de trapsensor wordt geschakeld, maar ik besluit niet naar boven of naar beneden te lopen, dan blijven de ledstrips branden.
Kan iemand mij hiermee helpen?
Ik ben nieuw in het programmeren, en hulp zou ik zeer waarderen.

Alvast bedankt.

cpp code
#define SpeedOn 25 //Time speed leds turning on in mili seconds
#define SpeedOff 50 //Time speed leds turning off in mili seconds
#define AmoundLed 14 //Amound of leds you use, max

#define sensorUpPin 2 //PIR boven
#define sensorDownPin 3 //PIR beneden
#define ledDown 8
#define ledUp 9
#include <Wire.h>
#include <PCA9685.h>

boolean downSensorSet = false;
boolean upSensorSet = false;
int sensorUpVal = 0;
int sensorDownVal = 0;

PCA9685 ledDriver;

void setup() {

pinMode(sensorUpPin, INPUT); //Boven
pinMode(sensorDownPin, INPUT); //Beneden
pinMode(ledDown, OUTPUT);
pinMode(ledUp, OUTPUT);

Wire.begin(); // Wire must be started!
ledDriver.begin(B101000); // Address pins A5-A0 set to B111000
ledDriver.init();

}

void loop() {

sensorUpVal = digitalRead(sensorUpPin);
if (sensorUpVal == HIGH) {
digitalWrite(ledUp, HIGH);

//driveLedsInvertedOff();
if (downSensorSet) {
driveLedsInvertedOff();
downSensorSet = false;
}

else if (!upSensorSet && !downSensorSet) {
upSensorSet = true;
driveLedsOn();
}
} else {
digitalWrite(ledUp, LOW);
delay(50);
}

sensorDownVal = digitalRead(sensorDownPin);
if (sensorDownVal == HIGH) {
digitalWrite(ledDown, HIGH);

//driveLedsInvertedOn();
if (upSensorSet) {
driveLedsOff();
upSensorSet = false;
}

else if (!downSensorSet && !upSensorSet) {
downSensorSet = true;
driveLedsInvertedOn();
}
} else {
digitalWrite(ledDown, LOW);
delay(50);
}
}

void driveLedsOn() {
for (int i = 0; i < AmoundLed; i++) {
for (int level = 10; level >= 0; level--) {
ledDriver.setLEDDimmed(i, level * 20);
delay(SpeedOn);
}
}
}

void driveLedsOff() {

for (int i = 0; i < AmoundLed; i++) {
for (int level = 0; level <= 10; level++) {
ledDriver.setLEDDimmed(i, level * 20);
delay(SpeedOff);
}
}
}

void driveLedsInvertedOn() {
for (int i = AmoundLed; i >= 0; i--) {
for (int level = 10; level >= 0; level--) {
ledDriver.setLEDDimmed(i, level * 20);
delay(SpeedOn);
}
}
}

void driveLedsInvertedOff() {
for (int i = AmoundLed; i >= 0; i--) {
for (int level = 0; level <= 10; level++) {
ledDriver.setLEDDimmed(i, level * 20);
delay(SpeedOff);
}
}
}

Advertisement

Gebruikers-avatar
Berichten: 4890
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Trapverlichting

Berichtdoor nicoverduin » 05 Mei 2017, 13:13

Eigenlijk zit je klem met de hele opzet van jouw programma:
a) je werkt met delays. Hierdoor is het lastig te onderbreken.
b) Commentaar is niet je sterkste punt waardoor een ander maar moet uitpluizen wat je aan het doen bent
c) Je hebt niet gedefinieerd hoe je wil ontdekken of je afziet van de actie. Hoe had je dat gedacht kenbaar te maken.

Oplossingen:
a) blink without delay kan al jouw delays de nek om draaien. Reden om deze zeer goed te bestuderen!!!!!!
b) jouw sketch van commentaar voorzien zodat een ander ook begrijpt waarom je inverted ed gebruikt.

Verder zou ik een waarheidstabel maken van alle combinaties die je wilt en welke acties je wilt uitvoeren. En DAN PAS gaan coderen.....
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Trapverlichting

Berichtdoor Hazet » 05 Mei 2017, 19:27

Dank voor jouw reactie, maar om heel eerlijk te zijn snap ik er weinig van.
Waarheidstabel bijvoorbeeld?
Wat ik wel weet is dat de code werkt met de 2 sensoren.
Het enige dat ontbreekt is een timer dat na 10 seconden de leds uitgaan.
Hoe ik dit voor elkaar krijg snap ik niet zo goed.

Mvg

Gebruikers-avatar
Berichten: 4890
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Trapverlichting

Berichtdoor nicoverduin » 05 Mei 2017, 19:47

Wat een waarheidstabel is..... google?
En jou pakketje eisen en wensen zweven nogal een beetje.... waar komen die 10 seconden nou weer vandaan? Of komt het omdat je de vraag op zo ongeveer elk mogelijk forum hebt geplaatst (cross posting zoals MAS het noemde) dat je nu door de bomen het bos niet meer ziet????
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Trapverlichting

Berichtdoor Koepel » 05 Mei 2017, 20:49

@Hazet, toch heeft nicoverduin helemaal gelijk hoor. Zijn eerste reactie was precies to-the-point. Ik had daar onder willen schrijven: "wat nico zegt", maar dat heb ik niet gedaan.

Je kunt het duidelijker te maken, door bijvoorbeeld in de loop() eerst alle gegevens verzamelen. Dus eerst alle sensoren en knoppen inlezen. Dan in een volgend deel alle gegevens verwerken.
Een waarheidstabel of een goede tekening of een nauwkeurige beschrijving, alles mag. En dan de code met de if-statements gewoon nieuw opschrijven. Er zitten nu logica foutjes in, en ik begrijp de bedoeling niet.

Hazet schreef:Het enige dat ontbreekt is een timer dat na 10 seconden de leds uitgaan.

Dat zien we vaak hier op het forum. Iemand heeft alles werkend op één klein dingetje na. Dat ene kleine dingetje blijkt nu net niet mogelijk te zijn, omdat de code verkeerd is opgebouwd. Dat geeft niet, dat kan gebeuren.

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

Re: Trapverlichting

Berichtdoor Hazet » 05 Mei 2017, 22:28

@Nico, Ik zal eens verder verdiepen in het waarheidstabel gedeelte en welke pakket van eisen en wensen? Het enige dat ik in de code wil hebben is dat de leds na 10 sec uitgaan. De 10 sec komt nergens vandaan. Het had ook 5 sec kunnen zijn. Thanks voor de reactie.

@Koepel, ook jij bedankt voor jouw reactie. Ik zal proberen alles van begin af aan op te zetten.

Ik snap dat het voor jullie gesneden koek is, maar ik ben nog lerende.

Maar beetje bij beetje komen we er wel.

Bedankt.

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

Re: Trapverlichting

Berichtdoor Koepel » 06 Mei 2017, 00:00

@Hazet, ik heb nog eens naar de code met alle if-statements zitten kijken. Maar ik ga daar echt niet in mee. Je gebruikt de status van de leds ook om eenmalig de knoppen te detecteren en soms moet de loop() twee keer door de code met de if-statements voordat alles goed staat.

Kun je om te beginnen betere namen geven ?
'downSensorSet' betekent: De leds zijn aan en hebben een omlaag-gaand patroon gedaan. Misschien is dit beter: "ledsActiveDown" of "ledsDown" of "activeDown" of "SequenceDown" of zo iets.
'sensorUpVal' betekent: er is gedetecteerd dat iemand omhoog gaat. Dus bijvoorbeeld "inputEventUp" of "inputUp" of zo iets.

De status van het geheel heeft drie toestanden: uit; aan (na een patroon omhoog); aan (na een patroon omlaag).
Voor een programmeur volgt daar uit dat het één variabele is die drie toestanden kan zijn.

Heb je eenmaal zo'n variabele, dan volgt daar uit dat het met een "state machine" kan. Heb je wel eens eerder een "state machine" gemaakt ? Dat hoeft niet, maar ik zie voor jouw project daar wel een paar voordelen van.

Het omlaag gaan en omhoog gaan is hetzelfde. Je zou zelfs alles in elkaar kunnen schuiven. Dan zijn er twee variabelen nodig, een variabele die aangeeft of de leds aktief zijn, en een variabele die aangeeft om omhoog- of omlaag-gaand gaat.

Het opdelen in twee delen (eerst alle gegevens verzamelen, daarna verwerken) betekent dat je code groter wordt.
Je zou beide ingangen kunnen inlezen en op beide een StateChangeDetection kunnen doen.
https://www.arduino.cc/en/Tutorial/StateChangeDetection
En dan twee boolean variabelen 'inputEventUp' en 'inputEventDown' naar het tweede deel sturen om te verwerken.

Met wat ik hierboven beschrijf wordt je sketch flink groter, maar dan wordt alles stap-voor-stap afgehandeld. Dat is beter dan een "black box" van if-statements die moeilijk te doorzien is.

Om na een minuut de leds uit te doen, dat kan met millis(). Dat past ook binnen een "state machine".
Hier leg ik uit hoe een tijdvertraging te maken is: http://arduinoforum.nl/viewtopic.php?f=25&t=2521&p=19208#p19208

Zit er een foutje in je functies voor de leds ?
Er zijn 14 leds, led nummer 0....13
De driveLedsOn() en driveLedsOff() doen 0...13, dat is okay.
De driveLedsInvertedOn() en driveLedsInvertedOff() doen 14...0, dat is wat anders.

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

Re: Trapverlichting

Berichtdoor Koepel » 08 Mei 2017, 22:06

@Hazat, zeg maar wat je wilt.
Een "state machine" vereist een bepaalde manier van programmeren. Dat is misschien iets voor later ;)
Wil je twee variabelen blijven gebruiken voor omhoog en omlaag ? Dat kan.

Maar ik wil graag van die grote if-constructie af, en ik zou graag de State-Change-Detection voor beide knoppen willen toevoegen. Lijkt je dat wat ?

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

Re: Trapverlichting

Berichtdoor Hazet » 09 Mei 2017, 16:18

Thanks.
Wat lijkt jou het beste?
Ik gebruik nu een arduino met een pwm shield waar de 14 ledstrips en de 2 pirs op aangesloten zijn.
De pwm shielld maakt gebruik van PCA 9685 IC2 interface.

Ik waardeer jouw advies hierin.

Grt

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

Re: Trapverlichting

Berichtdoor Koepel » 09 Mei 2017, 18:29

Dat hangt af van je ledstrips. Kan een PIR sensor daar op aangesloten worden ?

Ik had het alleen maar over software. Een "state machine" is namelijk een bepaalde manier van een programma indelen. Daarbij wordt het programma gestuurd door een 'state' (een variabele die verschillende waarden kan hebben).
Ik hou nu eenmaal meer van software dan hardware, en millis() en I2C zijn mijn stokpaardjes ;)

Waar het om gaat is een logische structuur van je code.
Dat is eigenlijk het enige waar nicoverduin en ik het over hebben.
Je wilt iets toevoegen (na een tijdje uitschakelen) en ik ga niet mee met die code met al die if-statements, want dat zit niet lekker in elkaar.

Dus we zitten te wachten totdat jij een goede beschrijving geeft, of een mooie tekening of zelfs een waarheidstabel.
Als je dat goed hebt, dan kan dat in code gezet worden.
Als het andere is bijzaak.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten