Paso 2: código
Interrupciones pueden ser difíciles, pin digital 2 es también PCINT0. por esta razón el botón está conectado al pin 2 pero la interrupción se fija a 0.
#include < Servo.h >
#include < CapacitiveSensor.h >
#include < avr/sleep.h >
byte const rojo = 6;
byte const verde = 7;
azul const byte = 8;
pot1 byte const = A0;
pot2 byte const = A1;
pot3 byte const = A2;
botón de byte const = 2;
empresa1 int = 1;
Código 2 de int = 1;
code3 int = 1;
int pot_val1 = 0;
int pot_val2 = 0;
int pot_val3 = 0;
int button_val = 0;
tacto del int;
unsigned currentMillis largo = 0;
unsigned codeMillis largo = 0;
unsigned buttonMillis largo = 0;
unsigned sleepMillis largo = 0;
CapacitiveSensor cs_10_11 = CapacitiveSensor(3,4);
Servo myservo;
int sleepCounter = 0;
Boolean estado = bajo;
void setup()
{
Serial.Begin(9600);
pinMode (rojo, salida);
pinMode (verde, salida);
pinMode (azul, salida);
pinMode (botón, entrada);
pinMode (pot1, entrada);
pinMode (pot2, entrada);
pinMode (pot3, entrada);
cs_10_11.set_CS_AutocaL_Millis(20000);
digitalWrite (botón, HIGH);
attachInterrupt (interrupción 0, levantamiento);
}
void loop()
{
getPots(); leer valores de olla
mapAllPots(); ajustar a la escala correcta
Si (pot_val1 == empresa1 & & pot_val2 == Código 2 & & pot_val3 == código3) //if contraseña es correcta
{
Serial.println("Success!");
g(); led de luz verde
Unlock(); desbloquear el seguro
sleepNow(); Vete a dormir
}
otra cosa
{
Serial.println("Failure");
r(); enciende led rojo
}
currentMillis = millis();
button_val =! digitalRead(button); leer el valor del botón
Serial.println(button_val);
Serial.println(sleepCounter);
if(button_val == 1) //if botón, reprogramó los cronómetros.
{
sleepMillis = currentMillis;
codeMillis = currentMillis;
}
Si ((currentMillis-sleepMillis) > 20000) //if temporizador expira, ir a dormir
{
sleepMillis = currentMillis;
sleepNow();
}
contacto = highLow(cs_10_11.capacitiveSensor(30)); leer capacitancia y mapa a binario alto o bajo
Serial.println(Touch);
currentMillis = millis();
if(Touch == 1)
{
Si ((currentMillis-codeMillis) > 5000) //if touch es de 1 por 5 segundos
{
b(); luz azul de th conducido
storeCode(); almacenar código de valores de la olla
Delay(300);
codeMillis = currentMillis;
}
}
if(Touch == 0) //if no toque reiniciar el temporizador para evitar la acumulación de tiempo
{
codeMillis = currentMillis;
}
}
fin del bucle
////////////////////////////////
void interrupt()
{
currentMillis = millis();
Si ((currentMillis-buttonMillis) > 200)
{
buttonMillis = currentMillis;
}
}
void sleepNow() / / de aquí ponemos el arduino para dormir
{
OFF(); apagar todos los leds
set_sleep_mode(SLEEP_MODE_PWR_DOWN); modo de reposo se encuentra aquí
sleep_enable(); permite que el pedacito de sueño en el registro mcucr
por lo que el sueño es posible. solo un perno de seguridad
attachInterrupt (interrupción 0, levantamiento); utilizar interrupción 0 (pin 2) y ejecutar la función
wakeUpNow cuando pin 2 bajo
MCUCR = bit (BOD) | bit (BODSE); Encienda brown-out permite seleccionar
MCUCR = bit (BOD); Esto debe hacerse dentro de 4 ciclos de reloj de arriba
sleep_mode(); Aquí el dispositivo realmente se pone a dormir!!
EL PROGRAMA CONTINÚA AQUÍ DESPUÉS DE DESPERTAR
sleep_disable(); lo primero después de despertar del sueño:
desactivar el sueño...
detachInterrupt(0); deshabilita interrupción 0 en el pin 2 hasta el
no se ejecutará código wakeUpNow
durante el tiempo de funcionamiento normal
}
highLow int (sin firmar largo x)
{
Si (x > = 300)
{
retorno 1;
}
otra cosa
{
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 en)
{
if (en > 1010) {}
retorno 1;
}
else if (de > 950) {}
retorno 2;
}
else if (en > 900) {}
retorno 3;
}
else if (en > 630) {}
retorno 4;
}
else if (en > 480) {}
Retorno 5;
}
else if (en > 190) {}
retorno 6;
}
else if (a > 80) {}
retorno 7;
}
else if (en > 30) {}
retorno 8;
}
else if (en > 3) {}
retorno 9;
}
}
void storeCode()
{
empresa1 = pot_val1;
Código 2 = pot_val2;
Code3 = pot_val3;
}
r() vacío
{
digitalWrite (rojo, alto);
digitalWrite (verde, baja);
digitalWrite (azul, bajo);
}
g() vacío
{
digitalWrite (rojo, baja);
digitalWrite (verde, alto);
digitalWrite (azul, bajo);
}
void b()
{
digitalWrite (rojo, baja);
digitalWrite (verde, baja);
digitalWrite (azul, alto);
}
off() vacío
{
digitalWrite (rojo, baja);
digitalWrite (verde, baja);
digitalWrite (azul, bajo);
}
unlock() vacío
{
myservo.Attach(9);
myservo.Write(75);
Delay(750);
myservo.Write(96);
Delay(250);
myservo.Detach();
}