Étape 2: code
Interruptions peuvent être délicates, broche numérique 2 est également PCINT0. C’est pourquoi le bouton est relié à la broche 2, mais l’interruption est fixée à 0.
#include < Servo.h >
#include < CapacitiveSensor.h >
#include < avr/sleep.h >
const byte rouge = 6 ;
const byte vert = 7 ;
bleu const byte = 8 ;
const byte pot1 = A0 ;
const byte pot2 = A1 ;
const byte pot3 = A2 ;
le bouton octet const = 2 ;
int code1 = 1 ;
int code2 = 1 ;
int code 3 = 1 ;
int pot_val1 = 0 ;
int pot_val2 = 0 ;
int pot_val3 = 0 ;
int button_val = 0 ;
touch int ;
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 ;
Boolean Etat = faible ;
void setup()
{
Serial.Begin(9600) ;
pinMode (rouge, sortie) ;
pinMode (verte, sortie) ;
pinMode (blue, sortie) ;
pinMode (bouton, entrée) ;
pinMode (pot1, entrée) ;
pinMode (pot2, entrée) ;
pinMode (pot3, entrée) ;
cs_10_11.set_CS_AutocaL_Millis(20000) ;
digitalWrite (bouton, HIGH) ;
attachInterrupt (0, interruption, RISING) ;
}
void loop()
{
getPots() ; lire dans valeurs de pot
mapAllPots() ; les adapter à la bonne échelle
Si (pot_val1 == code1 & & pot_val2 == code2 & & pot_val3 == code 3) //if mot de passe est correct
{
Serial.println("Success!") ;
g() ; led de lumière verte
Unlock() ; débloquer le loquet
sleepNow() ; Aller se coucher
}
d’autre
{
Serial.println("failure") ;
r() ; allumer la led rouge
}
currentMillis = millis() ;
button_val =! digitalRead(button) ; lire la valeur de la touche
Serial.println(button_val) ;
Serial.println(sleepCounter) ;
if(button_val == 1) //if touche, réinitialiser les compteurs.
{
sleepMillis = currentMillis ;
codeMillis = currentMillis ;
}
Si ((currentMillis-sleepMillis) > 20000) //if minuterie expire, aller pour dormir
{
sleepMillis = currentMillis ;
sleepNow() ;
}
Contact = highLow(cs_10_11.capacitiveSensor(30)) ; lu capacitance touch et mappez-la binaire haute ou basse
Serial.println(Touch) ;
currentMillis = millis() ;
if(Touch == 1)
{
Si ((currentMillis-codeMillis) > 5000) //if touch est de 1 pour 5 secondes
{
b() ; led lumière bleue de th
storeCode() ; stocker le code de valeurs de pot
Delay(300) ;
codeMillis = currentMillis ;
}
}
if(Touch == 0) //if sans contact réinitialiser la minuterie pour empêcher l’accumulation de temps
{
codeMillis = currentMillis ;
}
}
fin de boucle
////////////////////////////////
Sub interrupt()
{
currentMillis = millis() ;
Si ((currentMillis-buttonMillis) > 200)
{
buttonMillis = currentMillis ;
}
}
void sleepNow() / / ici, nous mettons l’arduino pour dormir
{
OFF() ; désactiver toutes les leds
set_sleep_mode(SLEEP_MODE_PWR_DOWN) ; mode "veille" est défini ici
sleep_enable() ; permet le peu de sommeil dans le registre mcucr
sommeil est donc possible. juste une épingle de sûreté
attachInterrupt (0, interruption, RISING) ; Utilisez interruption 0 (axe 2) et exécuter une fonction
wakeUpNow quand broche 2 devient faible
MCUCR = bit (BODS) | bit (BODSE) ; Allumez brown-out enable sélectionne
MCUCR = bit (CD) ; Ceci doit être effectué au sein de 4 cycles d’horloge qui précède
sleep_mode() ; ici, l’appareil est effectivement mis à dormir!!
LE PROGRAMME CONTINUE D’ICI APRÈS LE RÉVEIL
sleep_disable() ; la première chose après le réveil du sommeil :
désactiver le sommeil...
detachInterrupt(0) ; désactive interrompre 0 sur broche 2 donc le
code de wakeUpNow ne sera pas exécuté
au cours de la durée normale
}
int highLow (unsigned long x)
{
Si (x > = 300)
{
Return 1 ;
}
d’autre
{
return 0 ;
}
}
Sub getPots()
{
pot_val1 = analogRead(pot1) ;
pot_val2 = analogRead(pot2) ;
pot_val3 = analogRead(pot3) ;
}
Sub mapAllPots()
{
pot_val1 = mapPot(pot_val1) ;
pot_val2 = mapPot(pot_val2) ;
pot_val3 = mapPot(pot_val3) ;
}
int mapPot (int dans)
{
if (en > 1010) {}
Return 1 ;
}
ElseIf (en > 950) {}
retour 2 ;
}
ElseIf (categorie > 900) {}
retour 3 ;
}
ElseIf (en > 630) {}
retour 4 ;
}
ElseIf (en > 480) {}
retour 5 ;
}
ElseIf (en > 190) {}
retour 6 ;
}
ElseIf (dans > 80) {}
retour 7 ;
}
ElseIf (en > 30) {}
retour 8 ;
}
ElseIf (en > 3) {}
retour 9 ;
}
}
Sub storeCode()
{
Code1 = pot_val1 ;
Code2 = pot_val2 ;
code 3 = pot_val3 ;
}
r() Sub
{
digitalWrite (rouge, haute) ;
digitalWrite (vert, faible) ;
digitalWrite (bleu, faible) ;
}
void g()
{
digitalWrite (rouge, faible) ;
digitalWrite (vert, HIGH) ;
digitalWrite (bleu, faible) ;
}
b() Sub
{
digitalWrite (rouge, faible) ;
digitalWrite (vert, faible) ;
digitalWrite (bleu, HIGH) ;
}
Sub off()
{
digitalWrite (rouge, faible) ;
digitalWrite (vert, faible) ;
digitalWrite (bleu, faible) ;
}
unlock() Sub
{
myservo.Attach(9) ;
myservo.Write(75) ;
Delay(750) ;
myservo.Write(96) ;
Delay(250) ;
myservo.Detach() ;
}