Paso 8: Agregar botones analógicos
Muy bien. Ya que soy bastante magra en mis pines disponibles en el arduino (tengo 7,8 y 9 pines digitales disponibles, actualmente y todavía tiene que conectar el horno y los amortiguadores), voy a buscar una manera de utilizar las entradas analógicas disponibles (tengo A0 a A3 disponible, ya que el A4 y A5 están conectado a la RTC) para aceptar la entrada de botón. Quckly bastante encontrar algo que es muy prometedor - un tutorial de como aceptar la entrada de varios botones a través de una entrada analógica solo. Suciedad de la paga. Esto es perfecto, y todo lo que requiere es algunas resistencias adicionales. No hay problema sea cual sea. Vayamos al cableado.
(Ver este tutorial para una del tutorial de la boca de caballos en funcionamiento)
El cableado para esto es super sencillo. Ejecutar un cable en el pin analógico de su elección (mi programa lee del pin A0) y conecte a un lado de la matriz de botón. Al otro lado de la matriz de botón está conectado a tierra. A partir de ahí, los botones son simplemente encadenados junto a través de una red de resistencia. Un cable adicional se agrega de cada botón con el conector de entrada analógico, por lo que cada botón tiene un camino directo a la analógica del perno (véase esquema).
Toma las piezas pertinentes del código del tutorial y modificar nuestras propias necesidades, obtenemos lo siguiente:
/ * Esta es la aplicación que utilizará para controlar el horno. El concepto es la siguiente: tengo 3 zonas monitorizará. Cada zona tendrá al menos un regulador de zona que será controlado por la aplicación de arduino. Cada zona tendrá un único termómetro que presentará un informe al regulador. Dependiendo de la lectura del termómetro y el termostato, los amortiguadores se abierto o cerrado y se encenderá el horno central. Una vez que se haya alcanzado una temperatura aceptable en todas las zonas, el horno se apagará. Además de ciclos de calefacción general, el sistema es programable. En este momento, sin embargo, el ciclo de programación se atenderán aquí, no a través del termostato. IMPORTANTES casos de prueba: (agregarse como que piensan venir a través de ellos * necesita asegurarse de que el horno siempre está apagado si se cierran todos los 3 amortiguadores. * amortiguadores deben estar abiertos a menos que específicamente necesitan cerrarse. * Si el sistema se establece en "hold", todas las zonas están listos para abrir y la programación hace no funciona. * Si sistema es invalidado pero no , la anulación se detiene una vez que sale el próximo intervalo programado * / #include //This es una librería para el LCD pantalla #include //This es una librería necesaria para el termómetro lecturas #include //This es una biblioteca de temperatura #include #include "RTClib.h" / / conexiones: / / rs (pin 4 del LCD) para Arduino pin 12 / / rw (pin 5 del LCD) para Arduino pin 11 / / habilitar (pin 6 del LCD) a pin 10 del Arduino / / LCD pin 15 al pin 13 de Arduino / / LCD pines d4 , d5, d6, d7 a Arduino pins 5, 4, 3, 2 lcd LiquidCrystal (12, 11, 10, 5, 4, 3, 2); grados de Byte [8] = {B01000 B10100, B01000, B00111, B00100, B00110, B00100, B00100}; const int contraluz = 13; controles de retroiluminación #define THERM_BUS 6 / / todas las lecturas de temperatura llegan a través de este pin único. OneWire oneWire(THERM_BUS); DallasTemperature sensors (& oneWire); DeviceAddress zone1Therm = {0x28, 0x48, 0 x 39, 0x11, 0 x 04, 0 x 00, 0 x 00, 0x94}; DeviceAddress zone2Therm = {0x28, 0xF2, 0x1F, 0x11, 0 x 04, 0 x 00, 0 x 00, 0x38}; DeviceAddress zone3Therm = {0x28, 0xBA, 0xF3, 0 x 10, 0 x 04, 0 x 00, 0 x 00, 0x98}; RTC_DS1307 RTC; Inicio programación / veces son 6 AM, 8:00, 15:00 y 21:00 int * PROGRAMMED_VALUES [7]; int SUNDAY_VALUES [4] = {67, 67, 67, 60}; int MONDAY_VALUES [4] = {67, 67, 67, 60}; int TUESDAY_VALUES [4] = {67, 67, 67, 60}; int WEDNESDAY_VALUES [4] = {67, 67, 67, 60}; int THURSDAY_VALUES [4] = {67, 67, 67, 60}; int FRIDAY_VALUES [4] = {67, 67, 90, 75}; int SATURDAY_VALUES [4] = {67, 67, 67, 60}; PROGRAMACIÓN final float zone1Temp = 0; Float zone2Temp = 0; Float zone3Temp = 0; Boolean z1Check = 0; Boolean z2Check = 0; Boolean z3Check = 0; Boolean isOverrideHeld = false; Boolean isOverridden = false; Boolean furnaceState = false; con furnaceState, false significa que es en la actualidad, verdad significa su en la actualidad. String thermState = "ejecutar"; int overrideValue = 0; const int furnacePin = 1; int zoneCounter = 0; int a = 0; void setup() {Serial.begin(57600); / / Esto conecta el arduino al ordenador //TEMPERATURE configuración de SENSOR sensors.begin(); sensors.setResolution (zone1Therm, 10); lcd.createChar (0, grados); / / configurar RTC. Wire.Begin(); RTC.begin(); if (!. RTC.isrunning()) {registro ("ERROR", "RTC no corre!"); //RTC.adjust (DateTime (__DATE__, __TIME__)); //THIS sólo necesita a ser línea si usted son ajuste hasta su RTC por primera vez! UNA VEZ QUE, ESTA DEBE ESTAR DESACTIVADA! } //SETUP salidas pinMode (furnacePin, salida); pinMode (luz de fondo, salida); digitalWrite (luz de fondo, alto); CONFIGURACIÓN entradas pinMode (A0, INPUT_PULLUP); CONFIGURACIÓN DE LA PROGRAMMED_VALUES PROGRAMA SEMANAL [0] = SUNDAY_VALUES; PROGRAMMED_VALUES [1] = MONDAY_VALUES; PROGRAMMED_VALUES [2] = TUESDAY_VALUES; PROGRAMMED_VALUES [3] = WEDNESDAY_VALUES; PROGRAMMED_VALUES [4] = THURSDAY_VALUES; PROGRAMMED_VALUES [5] = FRIDAY_VALUES; PROGRAMMED_VALUES [6] = SATURDAY_VALUES; } / / Esto funciona el bucle continua void loop() {delay(3000); //DELAY actualmente establecido a 10 segundos. Registrará //DATE/TIME ajuste necesario como lógica ("tiempo", "Bucle iniciado en" + getDateAndTime()); Sensors.requestTemperatures() de temperatura lógica; zone1Temp = getTemperature(zone1Therm); zone2Temp = getTemperature(zone2Therm); zone3Temp = getTemperature(zone3Therm); logTemperatureData(); getScreenOutput(); z1Check = checkZoneTemp(zone1Temp); z2Check = checkZoneTemp(zone2Temp); z3Check = checkZoneTemp(zone3Temp); Si (z1Check || z2Check || z3Check) {startFurnace();} else {stopFurnace();} si (z1Check & & furnaceState) {closeDamper(1);} else {openDamper(1);} si (z2Check & & furnaceState) {closeDamper(2);} else {openDamper(2);} si (z3Check & & furnaceState) {closeDamper(3);} else {openDamper(3);} a = analogRead(0); ESTOS NÚMEROS CAMBIAN DEPENDIENDO DE TUS RESISTENCIAS. if(a < 20) {//This significa temperatura arriba isOverridden = true;} si (< 30 & & a > 20) {//This significa temperatura abajo. isOverridden = true;} si (< 45 & & a > 30) {//This es un palanca para hold/run si (thermState == 'hold') {thermState = "ejecutar"; isOverridden = false;} persona {thermState = "hold"; isOverridden = true;} isOverridden = true;} si (< 60 & & a > 45) {//DO necesito un cuarto botón?}} Boolean checkZoneTemp (int temperatura) {int temp = getTargetTemperature(); if(temperature > temp) {vuelta falso;} verdaderas;} void logTemperatureData() {registro ("Zone1Temp", (String)(int)zone1Temp); registro ("Zone2Temp", (String)(int)zone2Temp); registro ("Zone3Temp", (String)(int)zone3Temp);} void getScreenOutput() {zoneCounter ++; if(zoneCounter == 1) {String val = "Zone1:" + (String) (int) zone1Temp; Val += "(" + (String)getTargetTemperature(); += de Val (cadena) ")"; toScreen (val, "modo de:" + getModeString());} else if (zoneCounter == 2) {String val = "Zone2:" + (String) (int) zone2Temp; Val += "(" + (String)getTargetTemperature(); += de Val (cadena) ")"; toScreen (val, "horno de:" + getFurnaceState());} Else {zoneCounter = 0; Cadena val = "Zone3:" + (String) (int) zone3Temp; Val += "(" + (String)getTargetTemperature(); += de Val (cadena) ")"; toScreen (val, "abrir:" + getActiveZonesForScreen());}} int getTargetTemperature() {int modo = getMode(); Fecha y hora = ahora RTC.now(); fecha de int = now.dayOfWeek(); int * valores = {0}; log ("info", fecha (cadena)); valores = PROGRAMMED_VALUES [fecha]; log ("info", "conseguir la temperatura objetivo:" + (String)values[mode]); devolver valores [modo]; } String getActiveZonesForScreen() {String retVal = ""; Si (z1Check & &! furnaceState) {retVal += "1";} si (z2Check & &! furnaceState) {retVal += "2,";} if(z3Check && ! furnaceState) {retVal += "3";} if(retVal.length() == 0) {retVal += 'None';} vuelta retVal; } String getFurnaceState() {if(furnaceState) {return "On";} else {return "Off";}} String getModeString() {int modo = getMode(); switch (modo) {caso 0: volver "Wake", caso 1: volver 'Cantar'; caso 2: volver a "Inicio"; caso 3: volver a "Dormir"; por defecto: volver "N/A";}} int getMode() {DateTime ahora = RTC.now(); int hora = now.hour(); si (hora < 6 || hora > = 21) {regresar 3;} si (hora > = 6 & & hora < 8) {return 0;} si (hora > = 8 & & hora < 15) {Regresar 1;} si (hora > = 15 & & hora < 21) {volver 2;}} flotador getTemperature (DeviceAddress deviceAddress) {float tempC = sensors.getTempC(deviceAddress); / / Serial.println(tempC); si (tempC ==-127) {Serial.println ("ERROR al obtener la temperatura.");} vuelta DallasTemperature::toFahrenheit(tempC);} //convenience función. Se encarga de todo el modelo para escribir en el LCDScreen void toScreen (String line1Value, String line2Value) {lcd.begin(16,2); lcd.clear(); lcd.setCursor(0,0); lcd.print(line1Value); lcd.setCursor(0,1); lcd.print(line2Value);} String getDateAndTime() {DateTime ahora = RTC.now(); volver String(now.year()) + "/" + String(now.month()) + "/" + String(now.day()) + "" + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());} void openDamper (int apagador) {/ / si (amortiguador == damper1Pin || amortiguador == damper2Pin || amortiguador == damper3Pin) {/ / digitalWrite (apagador, HIGH); / /} otro {/ / log ("problema al abrir el apagador. Amortiguador que no se encuentra. Esperaba 1, 2 o 3. Tiene "+ amortiguador); }} void closeDamper (int apagador) {/ / si (amortiguador == damper1Pin || amortiguador == damper2Pin || amortiguador == damper3Pin) {/ / digitalWrite (apagador, LOW); / /} otro {/ / log ("problema de amortiguador de cierre. Amortiguador que no se encuentra. Esperaba 1, 2 o 3. Tiene "+ amortiguador); }} //function para los mensajes de registro a la consola. Finalmente planea escribir al archivo de registro en RPi registro vacío (código de cadena, String mensaje) {Serial.println (código + ":" + mensaje);} anular recordData (tipo cadena, objeto String, String valor) {/ TODO - salida a base de datos de RPi} void startFurnace() {//Send señal adecuada para el horno para poner en marcha if(!furnaceState) {furnaceState =! furnaceState; registro ("INFO", "A partir de horno"); digitalWrite (furnacePin, HIGH);}} void stopFurnace() {//Send señal adecuada al horno dejar if(furnaceState) {furnaceState =! furnaceState; registro ("INFO", "Horno de detener"); digitalWrite (furnacePin, LOW);}}