Auto Alarm

Arduino specifieke Software
Berichten: 10
Geregistreerd: 10 Aug 2016, 17:23

Auto Alarm

Berichtdoor jeroenmert » 10 Aug 2016, 18:12

Dag allemaal,

Ik wil graag een alarm installatie in mijn auto bouwen met een arduino.
Ik heb afstandbedieningen met relaiscontacten. Als ik op een drukknop druk ontvangt de arduino een positieve puls.
Weet iemand hoe ik mijn programma kan werkend krijgen? Denk dat de fout vooral licht bij het setten en resetten van de variabels (alarm en locked) Want locked wordt telkens hoog als er geen input hoog is en ook als ik unlock.
Alvast bedankt :)

Mvg, Jeroen

Dit is mijn programma maar werkt niet:

// inputs
int Tilt = 2; // tiltsensor
int Moving = 3; // bewegingsensor
int DoorCon = 4; // deurcontact
int lock = 5; // afstandsbediening slotje
int unlock = 6; // afstandsbediening slotje los
int mute = 7; // afstandsbediening geluid af (gebruik ik niet)

// outputs
int pinker = 8; // richtingaanwijzers lichten
int horn = 9; // toeter
int doorlock = 10; // deurslot

// interne variabel
int alarm = 0;
int locked = 0;

int TiltSensor = 0;
int MovingSensor = 0;
int DoorContact = 0;
int LockButton = 0;
int UnlockButton = 0;
int MuteButton = 0;

void setup() {
pinMode( Tilt, INPUT);
pinMode( Moving, INPUT);
pinMode( DoorCon, INPUT);
pinMode( lock, INPUT);
pinMode( unlock, INPUT);
pinMode( mute, INPUT);
pinMode( pinker, OUTPUT);
pinMode( horn, OUTPUT);
pinMode( doorlock, OUTPUT);
}

void loop() {

TiltSensor = digitalRead(Tilt);
MovingSensor = digitalRead(Moving);
DoorContact = digitalRead(DoorCon);
LockButton = digitalRead(lock);
UnlockButton = digitalRead(unlock);
MuteButton = digitalRead(mute);

alarm = digitalRead(alarm);
locked = digitalRead(locked); // de fout denk ik want als locked 0 is wordt de nieuwe locked wel 1!!!

if (UnlockButton == HIGH)
{
digitalWrite( locked, LOW);
}
if (LockButton == HIGH)
{
digitalWrite( locked, HIGH);
}


if (locked == HIGH && !alarm )
{// !alarm nog teste!!!! alarm word wel al hoog
digitalWrite( doorlock, HIGH);
delay(10000); // 10s
if (TiltSensor == HIGH || MovingSensor == HIGH || DoorContact == HIGH)
{
digitalWrite( alarm, HIGH);
}
}
if (locked == LOW)
{
digitalWrite( doorlock, LOW);
digitalWrite( alarm, LOW);
}


if (alarm == HIGH)
{
digitalWrite( pinker, HIGH);
digitalWrite( horn, HIGH);
delay(1000);
digitalWrite( pinker, LOW);
digitalWrite( horn, LOW);
delay(1000);
}
else
{
digitalWrite( pinker, LOW);
digitalWrite( horn, LOW);
}
}

Advertisement

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

Re: Auto Alarm

Berichtdoor Koepel » 10 Aug 2016, 19:41

Toen ik je code zag, was mijn eerste reactie: "huh ?". Je gebruikt variabelen op een vreemde manier.

Zou je eerst de basis op orde willen brengen ?
Ik geef een pin altijd het woord "Pin", zodat ik zelf niet in de war raak.
Een boolean variabele is bij mij altijd een 'boolean' en nooit een 'int'.
Ik gebruik geen boolean test op een variabele die HIGH of LOW kan zijn.

Dus je zou "TiltPin", "MovingPin" enzovoorts kunnen doen. Maar als jij het uit elkaar kunt houden, dan hoeft het natuurlijk niet.

Deze regels zijn me onduidelijk:
Code: Alles selecteren
alarm = digitalRead(alarm);
locked = digitalRead(locked);

Als je een digitale pin leest met digitalRead(), gebruik dan altijd een pin als parameter. Maar ik weet niet eens welke pin je wilt lezen of waar die twee regels voor zijn. Als de variabelen nul zijn, dan lezen ze van pin 0, dat is de RX van de seriale poort op een Arduino Uno.

Code: Alles selecteren
if( locked == HIGH && !alarm)

De variabelen "alarm" en "locked" zijn integer en kunnen HIGH of LOW zijn. Dus de boolean operator "!alarm" is wat mij betreft fout. Dat sommigen het toch zo doen, dat maakt mij niet uit :roll:

Berichten: 10
Geregistreerd: 10 Aug 2016, 17:23

Re: Auto Alarm

Berichtdoor jeroenmert » 10 Aug 2016, 20:27

Koepel schreef:Toen ik je code zag, was mijn eerste reactie: "huh ?". Je gebruikt variabelen op een vreemde manier.

Zou je eerst de basis op orde willen brengen ?
Ik geef een pin altijd het woord "Pin", zodat ik zelf niet in de war raak.
Een boolean variabele is bij mij altijd een 'boolean' en nooit een 'int'.
Ik gebruik geen boolean test op een variabele die HIGH of LOW kan zijn.

Dus je zou "TiltPin", "MovingPin" enzovoorts kunnen doen. Maar als jij het uit elkaar kunt houden, dan hoeft het natuurlijk niet.

Deze regels zijn me onduidelijk:
Code: Alles selecteren
alarm = digitalRead(alarm);
locked = digitalRead(locked);

Als je een digitale pin leest met digitalRead(), gebruik dan altijd een pin als parameter. Maar ik weet niet eens welke pin je wilt lezen of waar die twee regels voor zijn. Als de variabelen nul zijn, dan lezen ze van pin 0, dat is de RX van de seriale poort op een Arduino Uno.

Code: Alles selecteren
if( locked == HIGH && !alarm)

De variabelen "alarm" en "locked" zijn integer en kunnen HIGH of LOW zijn. Dus de boolean operator "!alarm" is wat mij betreft fout. Dat sommigen het toch zo doen, dat maakt mij niet uit :roll:

Heel hard bedankt voor de informatie.

Ik heb ondertussen dit verwijderd:
alarm = digitalRead(alarm);
locked = digitalRead(locked);

en
digitalWrite( locked, HIGH); veranderd in locked = 1; dit had ik verkeert, digitalwrite mag niet voor variabelen, dus nu voor alle variabelen aangepast.

Nu werkt de alarm installatie zelfs :) met mijn basiskennis xp
enkel heb ik de 10s in 1s veranderd. Dacht 10s te gebruiken zodat je de auto al op slot kan doen ook al staat er nog een deur open zodat je die binnen 10s nog kan sluiten.
Nu zit ik enkel met het probleem voor te unlocken.
De arduino ziet mijn unlock signaal niet omdat ik deze telkens de 2delays uitvoerd. Kan ik dit niet oplossen met counters te gebruiken in plaats van delay??

Dus nu eerst dat probleem oplossen en dan naar volgende stap, batterij spanning lezen en led laten branden als batterij te laag is. en als er te veel stroom wordt verbruikt als contact af staat dat dan een buzzer afgaat.

De centrale vergrendling heb ik ondertussen maar op de afstandbediening module geplaatst omdat de vergrendeling een puls nodig heeft en Massa en + moeten verwisseld worden voor vast en los dus niet eenvoudig met arduino.

Zou de ardruino uno en 2 leds toch niet te veel verbruiken voor de batterij?

(PS de alarm installatie is voor een oldtimer, mijn kadett c coupe rallye.)

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

Re: Auto Alarm

Berichtdoor Koepel » 10 Aug 2016, 20:36

Hoelang is dat unlock signaal aktief ?

Je kunt je sketch ombouwen van delay() naar millis(). Dat is handig voor later, als je nog dingen wilt toevoegen.
Met millis() kun je bijvoorbeeld iets laten knipperen met 2 keer per seconden, tegelijkertijd een paar wachttijden bijhouden, en tegelijkertijd 20 keer per seconden een paar knoppen lezen, tegelijkertijd een display 3 keer per seconden updaten, en ook nog op de achterground een deuntje spelen met een luidsprekertje.

Misschien is het beter om nu eerst het unlock signaal aan een interrupt te hangen met AttachInterrupt. In de interrupt routine bijvoorbeeld alleen een byte variabele zetten, en die bekijken en terug zetten in de loop().

Wat voor batterij bedoel je ? Een 9V battery kun je gebruiken voor rookmelders, maar niet voor een Arduino board.

Berichten: 10
Geregistreerd: 10 Aug 2016, 17:23

Re: Auto Alarm

Berichtdoor jeroenmert » 10 Aug 2016, 21:55

Het unlock signaal is niet langer dan een seconde hoog komt van een relais die bekrachtigd word door de toets van de afstandsbediening.
Als ik delay door millis vervang krijg ik de foutmelding: 'millis': this function needs to be defined. millis (1000); heb ik gebruikt.
Ik heb de functie is opgezocht maar vindt het iets ingewikkeld.

Ik heb een arduino simolator gebruikt om te testen en daar ontvang ik het signaal als ik een drukknop gebruik en het unlock signaal is langer actief want een relais is niet zo snel als drukknop.

Met de batterij bedoel ik de de auto batterij, maar plaats wel een LM2596 Module voor de arduino te voeden om geen spikes te hebben.

Bedankt voor de hulp :)

Dit is nu het programma moet nog wel uw tips er inplaatsen de boolean en pin ga ik zeker nog gebruiken :)

void loop() {

TiltSensor = digitalRead(Tilt);
MovingSensor = digitalRead(Moving);
DoorContact = digitalRead(DoorCon);
LockButton = digitalRead(lock);
UnlockButton = digitalRead(unlock);
MuteButton = digitalRead(mute);


if (UnlockButton == HIGH)
{
locked = 0;
}
if (LockButton == HIGH)
{
locked = 1;
}


if (locked == HIGH && !alarm )
{
delay(1000); // 1s
if (TiltSensor == HIGH || MovingSensor == HIGH || DoorContact == HIGH)
{
alarm = 1;
}
}
if (locked == LOW)
{
alarm = 0;
}


if (alarm == HIGH)
{
digitalWrite( pinker, HIGH);
digitalWrite( horn, HIGH);
delay(1000);
digitalWrite( pinker, LOW);
digitalWrite( horn, LOW);
delay(1000);
}
else
{
digitalWrite( pinker, LOW);
digitalWrite( horn, LOW);
}
}

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

Re: Auto Alarm

Berichtdoor Koepel » 10 Aug 2016, 23:03

De variabele 'alarm' gebruik je als integer met 0 en 1, maar ook als boolean met !alarm en ook als de waarde van een ingang met HIGH en LOW. Kun je een van de drie mogelijkheden kiezen ?

Een boolean is 'true' of 'false'. Dan kun je code schrijven op deze manier:
Code: Alles selecteren
  boolean maan, zon;

  maan = true;
  zon = false;

  if( zon && !maan)
    Serial.println( "Het is dag");
  else if( !zon && maan)
    Serial.println( "Het is nacht");
  else if( !zon && !maan)
    Serial.println( "Het is nieuwe maan of zonsverduistering");
  else
    Serial.println( "Weet je zeker dat je op de planeet aarde bent?");


Een LM2596 is heel goed. Ik meen dat een apparaat voor in een auto een korte puls van 120V moet kunnen hebben.

Om millis() te gebruiken, is het nodig om de hele sketch om te bouwen.
Hier staat een mini test met millis() : http://www.arduinoforum.nl/viewtopic.php?f=8&t=1948&start=20#p14200

Dus: of je sketch ombouwen naar millis(), of een interrupt gebruikt, of een vreemde manier is de 'weak' aanroep die binnen millis() zit gebruiken.
Daarom lijkt me een interrupt beste. Kun je de attachInterrupt uitproberen ?

Berichten: 10
Geregistreerd: 10 Aug 2016, 17:23

Re: Auto Alarm

Berichtdoor jeroenmert » 11 Aug 2016, 22:59

Bedankt,
Heb nog geen tijd gehad om verder te werken maar in het weekend zal ik de boolean en intterupt eens testen.
Ik laat je zeker nog iets weten ;)

Berichten: 10
Geregistreerd: 10 Aug 2016, 17:23

Re: Auto Alarm

Berichtdoor jeroenmert » 16 Aug 2016, 20:12

Dag,

Ik heb de interrupt zitten testen, met hulp van volgende sites:
http://www.allaboutcircuits.com/technic ... n-arduino/
http://gammon.com.au/interrupts

Maar krijg de intterupt niet werkend in mijn programma :(
Heb met ISR geprobeert maar werkte ook niet. Weet jij hoe ik de interrupt in mijn programma kan gebruiken?
Ik moet de UnlockButton toch gebruiken om te intterupten?

Mvg, Jeroen

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Auto Alarm

Berichtdoor shooter » 16 Aug 2016, 22:27

kijk eens gewoon in de reference op de arduino.cc site daar staat het simpel uitgelegd.
en uiteraard als je wat verandert hebt, dan zul je het prog weer hier moeten zetten.
paul deelen
shooter@home.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Auto Alarm

Berichtdoor shooter » 16 Aug 2016, 22:31

kijk eens gewoon in de reference op de arduino.cc site daar staat het simpel uitgelegd.
en uiteraard als je wat verandert hebt, dan zul je het prog weer hier moeten zetten.
paul deelen
shooter@home.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: igosefaeukuma, ovohihifez en 80 gasten