Super Secret kryssrutan Lås med kapacitiv Touch (2 / 3 steg)
Steg 2: kod
Avbrott kan vara knepigt, digital stift 2 är också PCINT0. Det är därför på knappen ansluts till stift 2 men avbrottet är kopplad till 0.
#include < Servo.h >
#include < CapacitiveSensor.h >
#include < avr/sleep.h >
CONST byte röd = 6;
CONST byte grön = 7.
CONST byte blå = 8.
CONST byte pot1 = A0;
CONST byte pot2 = A1;
CONST byte pot3 = A2;
CONST byte knappen = 2;
int Dispositionskod 1 = 1;
int code2 = 1;
int code3 = 1;
int pot_val1 = 0;
int pot_val2 = 0;
int pot_val3 = 0;
int button_val = 0;
int touch;
osignerade långa currentMillis = 0;
osignerade långa codeMillis = 0;
osignerade långa buttonMillis = 0;
osignerade långa sleepMillis = 0;
CapacitiveSensor cs_10_11 = CapacitiveSensor(3,4);
Servo myservo;
int sleepCounter = 0;
booleska state = låg;
void setup()
{
Serial.BEGIN(9600);
pinMode (röd, produktionen);
pinMode (grön, utgång);
pinMode (blå, OUTPUT);
pinMode (knapp, indata);
pinMode (pot1, ingång);
pinMode (pot2, ingång);
pinMode (pot3, ingång);
cs_10_11.set_CS_AutocaL_Millis(20000);
digitalWrite (knappen, hög);
attachInterrupt (0, avbrott, RISING);
}
void loop()
{
getPots(); läste i potten värden
mapAllPots(); justera dem till rätt skala
om (pot_val1 == 1 & & pot_val2 == code2 & & pot_val3 == code3) //if lösenordet är korrekt
{
Serial.println("success!");
g(); ljus grön led
Unlock(); låsa upp låset
sleepNow(); Gå och lägga sig
}
annat
{
Serial.println("Failure");
r(); slå på röda led
}
currentMillis = millis();
button_val =! digitalRead(button); läsa värdet knappen
Serial.println(button_val);
Serial.println(sleepCounter);
IF(button_val == 1) //if-knappen trycks, nollställa tidmätarna.
{
sleepMillis = currentMillis;
codeMillis = currentMillis;
}
om ((currentMillis-sleepMillis) > 20000) //if timer löper ut, somnar
{
sleepMillis = currentMillis;
sleepNow();
}
Touch = highLow(cs_10_11.capacitiveSensor(30)); Läs touch kapacitans och karta den till binär högt eller lågt
Serial.println(touch);
currentMillis = millis();
IF(touch == 1)
{
om ((currentMillis-codeMillis) > 5000) //if touch är 1 i 5 sekunder
{
b(); th ljusblå ledde
storeCode(); lagra kod från potten värden
Delay(300);
codeMillis = currentMillis;
}
}
IF(touch == 0) //if ingen touch reset timer för att förhindra tid ackumulering
{
codeMillis = currentMillis;
}
}
slutet av loop
////////////////////////////////
void interrupt()
{
currentMillis = millis();
om ((currentMillis-buttonMillis) > 200)
{
buttonMillis = currentMillis;
}
}
void sleepNow() / / här vi lägga arduino att sova
{
Off(); Stäng av alla lysdioder
set_sleep_mode(SLEEP_MODE_PWR_DOWN); viloläge är inställd här
sleep_enable(); kan sova lite i registret mcucr
så sömn är möjligt. bara en säkerhetsnål
attachInterrupt (0, avbrott, RISING); avbryta 0 (pin 2) och köra funktion
wakeUpNow när stift 2 blir låg
MCUCR = bit (BODS) | bit (BODSE); slå på brunt ut aktivera Välj
MCUCR = bit (BODS); Detta måste ske inom 4 klockcykler av ovan
sleep_mode(); här är enheten faktiskt lägga till sova!!
PROGRAMMET FORTSÄTTER HÄRIFRÅN EFTER UPPVAKNANDET
sleep_disable(); första sak efter att vakna från viloläge:
Inaktivera sömn...
detachInterrupt(0); inaktiverar avbryta 0 på pin 2 så
wakeUpNow kod körs inte
under normal gångtid
}
int highLow (osignerade långa x)
{
om (x > = 300)
{
tillbaka 1.
}
annat
{
Return 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 i)
{
om (i > 1010) {
tillbaka 1.
}
annars om (i > 950) {
returnera 2.
}
annars om (i > 900) {
returnera 3.
}
annars om (i > 630) {
returnera 4.
}
annars om (i > 480) {
returnera 5.
}
annars om (i > 190) {
returnera 6.
}
annars om (i > 80) {
returnera 7.
}
annars om (i > 30) {
returnera 8.
}
annars om (i > 3) {
returnera 9.
}
}
void storeCode()
{
Dispositionskod 1 = pot_val1;
code2 = pot_val2;
code3 = pot_val3;
}
void r()
{
digitalWrite (röd, hög);
digitalWrite (grön, låg);
digitalWrite (blå, låg);
}
void g()
{
digitalWrite (röd, låg);
digitalWrite (grön, hög);
digitalWrite (blå, låg);
}
void b()
{
digitalWrite (röd, låg);
digitalWrite (grön, låg);
digitalWrite (blå, hög);
}
void off()
{
digitalWrite (röd, låg);
digitalWrite (grön, låg);
digitalWrite (blå, låg);
}
void unlock()
{
myservo.attach(9);
myservo.write(75);
Delay(750);
myservo.write(96);
Delay(250);
myservo.detach();
}