Paso 9: Haga los botones de hacer algo.
Cada botón tiene que asignar una función o propósito. En nuestro caso, los botones primeros y segundo son para aumentar o disminuir respectivamente los botones, y el tercer botón es para conmutar entre funcionamiento o modo de espera. He incluido un cuarto botón, pero no sé si su necesaria. Por ahora lo dejo en, pero vamos a ver.
El código Final:
Para los efectos de este Instructable, este es el código final
/ * / * 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 * puede reemplazar sólo parte superior explícita y límites inferiores. * / #include < LiquidCrystal.h > //This es una librería para el LCD pantalla #include < OneWire.h > //This es una librería necesaria para el termómetro lecturas #include < DallasTemperature.h > //This es una biblioteca de temperatura #include < Wire.h > #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 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; currentMode int = 0; const int furnacePin = 7; int zoneCounter = 0; int a = 0; int loopCounter = 0; int z1Pin = 8; int z2Pin = 9; int z3Pin = 13; borrado pin backlight para z3 void setup() {Serial.begin(57600); / / Esto conecta el arduino al ordenador //TEMPERATURE SENSOR SETUP sensors.begin(); sensors.setResolution (zone1Therm, 10); lcd.createChar (0, grados); / / configuración 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 (z1Pin, salida); pinMode (z2Pin, salida); pinMode (z3Pin, salida); Finalmente ajuste control de contraluz en arduino. Por ahora sólo instalaremos lo constante. 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(100); //DELAY.1 segundos actualmente definido. QUE ajustar como sea necesario //DATE/TIME lógica / / if (loopCounter % 2 == 0) {/ / log ("tiempo", "Bucle iniciado en" + getDateAndTime()); } //TEMPERATURE Lógica / / logTemperatureData(); Si (loopCounter % 30 == 0) {registro ("info", loopCounter (cadena)); //changes salida cada 3 segundos outputToScreen();} / / el siguiente nos permite sólo comprobar estado horno cada 60 segundos mientras leía el botón cambia en tiempo real efectivo si (loopCounter % 60 == 0) {registro ("info", loopCounter (cadena)); sensors.requestTemperatures(); zone1Temp = getTemperature(zone1Therm); zone2Temp = getTemperature(zone2Therm); zone3Temp = getTemperature(zone3Therm); z1Check = checkZoneTemp(zone1Temp); z2Check = checkZoneTemp(zone2Temp); z3Check = checkZoneTemp(zone3Temp); loopCounter = 0; si (z1Check || z2Check || z3Check) {startFurnace();} else {stopFurnace();} si (z1Check & & furnaceState) {closeDamper(z1Pin);} else {openDamper(z1Pin);} Si (z2Check & & furnaceState) {closeDamper(z2Pin);} else {openDamper(z2Pin);} si (z3Check & & furnaceState) {closeDamper(z3Pin);} else {openDamper(z3Pin);}} un = analogRead(0); ESTOS NÚMEROS CAMBIAN DEPENDIENDO DE TUS RESISTENCIAS. int targetTemp = getProgrammedTargetTemperature(); if(a < 20) {//This significa temperatura arriba isOverridden = true; si (overrideValue! = targetTemp & & overrideValue! = 0) {overrideValue ++;} else {overrideValue = targetTemp + 1;} if(overrideValue > 80) {overrideValue = 80;} registro ("info", "temperatura hasta" + (String) overrideValue); loopCounter = -1; Este restablece el contador de bucle, significado todo va ser correr otra vez} si (< 30 & & a > 20) {//This significa temperatura abajo. isOverridden = true; si (overrideValue! = targetTemp & & overrideValue > 0) {overrideValue--;} else {overrideValue = targetTemp - 1;} if(overrideValue < 50) {overrideValue = 50;} registro ("info", "temperatura para" + (String) overrideValue); loopCounter = -1; Este restablece el contador de bucle, significado todo va ser correr otra vez} si (< 45 & & a > 30) {//This es un palanca para hold/run si (thermState == 'hold') {thermState = "ejecutar"; isOverridden = false; registro ("info", "ajuste de thermState para ejecutar");} persona {thermState = "hold"; isOverridden = true; registro ("info", "ajuste de thermState para sujetar");} isOverridden = true; loopCounter = -1; //THIS restablece el contador de bucle, significado todo va ser correr otra vez} si (< 60 & & a > 45) {//DO necesito un cuarto ¿BOTÓN? } loopCounter ++; } 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 outputToScreen() {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());}} void checkMode() {int modo = getMode(); si (modo! = currentMode) {currentMode = modo; if(isOverridden) {si (thermState == "run") {//This lógica simplemente anula el valor de la anulación y se reanuda el programa si no se lleva a cabo la thermstate. De lo contrario, se utiliza el overrideValue. isOverridden = false; }}}} int getTargetTemperature() {checkMode(); if(isOverridden) {return overrideValue;} else {regresar getProgrammedTargetTemperature();}} int getProgrammedTargetTemperature() {int modo = getMode(); Fecha y hora = ahora RTC.now(); fecha de int = now.dayOfWeek(); int * valores = {0}; valores = PROGRAMMED_VALUES [fecha]; log ("info", "conseguir programa 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() {if(isOverridden) {si (thermState == "run") {vuelta "Reemplazar";} más {vuelta "HOLD";}} int modo = getMode(); switch (modo) {caso 0: volver "Wake", caso 1: volver 'Cantar'; caso 2: volver a "Inicio"; 3 del caso: volver a "Dormir"; -1 del caso: retorno "Error"; por defecto: volver "N/A";}} int getMode() {DateTime ahora = RTC.now(); int hora = now.hour(); si (hora < 6 || hora > = 21) {vuelta 3;} si (hora > = 6 & & hora < 8) {return 0;} si (hora > = 8 & & hora < 15) {Regresar 1;} Si (hora > = 15 & & hora < 21) {vuelta 2;} vuelta -1; } float getTemperature (DeviceAddress deviceAddress) {flotador 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 == z1Pin || amortiguador == z2Pin || amortiguador == z3Pin) {digitalWrite (apagador, HIGH); / / log ("información", "Amortiguador de apertura" + amortiguador);} else {registro ("error", "amortiguador de apertura del problema. Amortiguador que no se encuentra. Esperaba 1, 2 o 3. Tiene "+ amortiguador);}} void closeDamper (int apagador) {si (amortiguador == z1Pin || amortiguador == z2Pin || amortiguador == z3Pin) {digitalWrite (apagador, LOW); / / log ("información", "Amortiguador de cierre" + amortiguador);} else {registro ("error", "amortiguador de cierre del problema. Amortiguador que no se encuentra. Esperaba 1, 2 o 3. Tiene "+ amortiguador);}} función de 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);}}