Paso 7: Añadir en la pantalla LCD
Así que con nuestro reloj y nuestros sensores de temperatura de trabajo, vamos a entrar alguna salida hacia el controlador del LCD.
La primera parte de esto es determinar lo que quiero decir. El espacio es algo limitado ya que solo tengo un total de 32 caracteres en 2 líneas, así que la primera pregunta que tenía que responder era cómo mostrar todo lo que necesito para mostrar en los 32 caracteres.
Aquí está mi finales lecturas LCD:
Zone1: ()
Modo de:
Zone2: ()
Horno:
Zone3: ()
Abierto: < 1,2,3 / ninguno >
donde T1 es la temperatura de la zona 1, TT es la temperatura objetivo, modo es el modo actual se está ejecutando (despierto, lejos, casa, dormir, anulación o espera.
Abierto se refiere a que las zonas están abierto y recibir calor (si el horno está funcionando).
Esto era en realidad bastante sencillo. Tengo algunos calcular hacer hasta un símbolo personalizado se refiere, pero es bastante más abajo en mi lista de prioridades.
< Tt >< tt >< tt > / * 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: (añadir 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 tienen que ser cerrado. * / #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 los pines de Arduino 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. int overrideValue = 0; const int furnacePin = 1; int zoneCounter = 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 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);}} 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,";} si (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 la señal adecuada para el horno para poner en marcha if(!furnaceState) {furnaceState = ! furnaceState; log ("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);}} < TT >< TT >< TT >