Stap 2: code
Interrupts kunnen worden lastig, digitale pin 2 is ook PCINT0. dat is de reden waarom de knop is verbonden met pin 2, maar de interrupt vastzit op 0.
#include < Servo.h >
#include < CapacitiveSensor.h >
#include < avr/sleep.h >
Const byte rood = 6;
Const byte groen = 7;
Const byte blauw = 8;
Const byte pot1 = A0;
Const byte pot2 = a1 worden verkregen;
Const byte pot3 = A2;
Const byte knop = 2;
int Overzichtscode1 = 1;
int code2 = 1;
int code3 = 1;
int pot_val1 = 0;
int pot_val2 = 0;
int pot_val3 = 0;
int button_val = 0;
int de aanraking;
unsigned long currentMillis = 0;
unsigned long codeMillis = 0;
unsigned long buttonMillis = 0;
unsigned long sleepMillis = 0;
CapacitiveSensor cs_10_11 = CapacitiveSensor(3,4);
Servo myservo;
int sleepCounter = 0;
Booleaanse staat = laag;
VOID Setup
{
Serial.begin(9600);
pinMode (rood, OUTPUT);
pinMode (groen, uitvoer);
pinMode (blauw, uitvoer);
pinMode (button, INPUT);
pinMode (pot1, INPUT);
pinMode (pot2, INPUT);
pinMode (pot3, INPUT);
cs_10_11.set_CS_AutocaL_Millis(20000);
digitalWrite (knop, hoge);
attachInterrupt (0, interrupt, stijgt);
}
void loop
{
getPots(); lezen in pot waarden
mapAllPots(); hen aan te passen aan de juiste schaal
Als (pot_val1 == Overzichtscode1 & & pot_val2 == code2 & & pot_val3 == code3) //if wachtwoord correct is
{
Serial.println("success!");
g(); lichtgroen geleid
Unlock(); ontgrendelen van de vergrendeling
sleepNow(); Ga slapen
}
anders
{
Serial.println("Failure");
r(); inschakelen van rode led
}
currentMillis = millis();
button_val =! digitalRead(button); luiden naar de waarde van de knop
Serial.println(button_val);
Serial.println(sleepCounter);
if(button_val == 1) //if knop is ingedrukt, reset de timers.
{
sleepMillis = currentMillis;
codeMillis = currentMillis;
}
Als ((currentMillis-sleepMillis) > 20000) //if timer verloopt, gaan slapen
{
sleepMillis = currentMillis;
sleepNow();
}
aanraken = highLow(cs_10_11.capacitiveSensor(30)); Lees touch precisiecapaciteit en kaart het naar een binair getal hoog of laag
Serial.println(Touch);
currentMillis = millis();
if(Touch == 1)
{
Als ((currentMillis-codeMillis) > 5000) //if touch is 1 gedurende 5 seconden
{
b(); th lichtblauw geleid
storeCode(); code uit pot waarden opslaan
delay(300);
codeMillis = currentMillis;
}
}
if(Touch == 0) //if geen aanraking reset timer om te voorkomen dat de accumulatie van tijd
{
codeMillis = currentMillis;
}
}
einde van de lus
////////////////////////////////
VOID interrupt()
{
currentMillis = millis();
Als ((currentMillis-buttonMillis) > 200)
{
buttonMillis = currentMillis;
}
}
VOID sleepNow() / / hier zetten we de arduino te slapen
{
Off(); alle LED's uitschakelen
set_sleep_mode(SLEEP_MODE_PWR_DOWN); slaapstand ligt hier
sleep_enable(); kunnen de slaap bit in het mcucr-register
slapen is dus mogelijk. gewoon een veiligheidsspeld
attachInterrupt (0, interrupt, stijgt); interrupt 0 (pin 2) gebruikt en de functie uitvoert
wakeUpNow wanneer pin 2 krijgt een laag
MCUCR = bits (BODS) | bit (BODSE); brown-out inschakelen Selecteer inschakelen
MCUCR = bits (BODS); Dit moet gebeuren binnen 4 klokcycli van bovenstaande
SLEEP_MODE(); Hier is het apparaat eigenlijk laten inslapen!!
HET PROGRAMMA BLIJFT VANAF HIER NA HET WAKKER WORDEN
sleep_disable(); eerste ding na het ontwaken uit de slaap:
Ontredderen slaap...
detachInterrupt(0); Hiermee schakelt u onderbreken 0 op pin 2 zodat de
wakeUpNow code zal niet worden uitgevoerd
tijdens normale speelduur
}
int highLow (niet-ondertekende lang x)
{
Als (x > = 300)
{
return 1;
}
anders
{
keren 0;
}
}
VOID getPots()
{
pot_val1 = analogRead(pot1);
pot_val2 = analogRead(pot2);
pot_val3 = analogRead(pot3);
}
VOID mapAllPots()
{
pot_val1 = mapPot(pot_val1);
pot_val2 = mapPot(pot_val2);
pot_val3 = mapPot(pot_val3);
}
int mapPot (int in)
{
Als (in > 1010) {}
return 1;
}
anders als (in > 950) {}
terug 2;
}
anders als (in > 900) {}
terug 3;
}
anders als (in > 630) {}
terug 4;
}
anders als (in > 480) {}
terug 5;
}
anders als (in > 190) {}
terug 6;
}
anders als (in > 80) {}
terug 7;
}
anders als (in > 30) {}
terug 8;
}
anders als (in > 3) {}
retourneren van 9;
}
}
VOID storeCode()
{
Overzichtscode1 = pot_val1;
code2 = pot_val2;
code3 = pot_val3;
}
VOID r()
{
digitalWrite (rood, hoge);
digitalWrite (groen, lage);
digitalWrite (blauw, laag);
}
VOID g()
{
digitalWrite (rood, laag);
digitalWrite (groen, hoog);
digitalWrite (blauw, laag);
}
VOID b()
{
digitalWrite (rood, laag);
digitalWrite (groen, lage);
digitalWrite (blauw, hoge);
}
VOID off()
{
digitalWrite (rood, laag);
digitalWrite (groen, lage);
digitalWrite (blauw, laag);
}
VOID unlock()
{
myservo.attach(9);
myservo.write(75);
delay(750);
myservo.write(96);
delay(250);
myservo.Detach();
}