Bienvenido a la sexta y última parte de nuestra serie de pantallas Bluetooth.
En esta parte, también, se me ocurrió algo bueno para complementar las funciones anteriores. En la parte de hoy nos centraremos en la gestión de energía y batería para la unidad. Este es un complemento de la última parte, en la que utilizamos nuestra pantalla como un tablero publicitario en el mercado de pulgas. Raramente hay enchufes en el mercado de pulgas, por lo que tenemos que operar nuestra pantalla con un banco de energía. Pero, ¿qué pasa si nos quedamos sin energía o si queremos saber si el voltaje de suministro sigue siendo de 5 voltios? La mejor manera de hacer esto es usar una de las entradas analógicas para medir el voltaje de la batería y mostrar directamente el voltaje de funcionamiento en voltios en nuestra pantalla.
Además, sería útil una función de ahorro de energía, que podemos operar con los elementos de control (botones) instalados hasta ahora. Además, nuestra pantalla ahora tiene una función de depuración que nos ayuda a encontrar errores a nivel técnico y facilita la expansión del código.
Sin embargo, para que nuestra pantalla pueda detectar primero el voltaje del suministro sobre la piel, es necesario llevar a cabo una pequeña expansión de hardware adicional. Esta extensión consiste en la conexión del puerto analógico 5 con el voltaje de funcionamiento VDD. La conexión que consiste en un puente de alambre se muestra a continuación en el diagrama del circuito y se marca con una flecha roja.
En esta parte, también, estamos ampliando o adaptando el código fuente del firmware y, por lo tanto, cargando el siguiente código al Arduino:
#include <SPI.h> #include <Alambre.h> #include <Software Serial.h> #include <EEPROM.h> #include <Cristal líquido.h> #include <avr/dormir.h> #definir MaxInputBufferSize 20 // adapta un máximo de 255 caracteres a vlcdr #definir EEpromSize 990 #definir rLcdChr 20 #definir LcdRows 4 #definir intervalo 1000 #definir Luz de fondo 5 // LED de retroiluminación del puerto 5 #definir VoltageSensingPin 5 // #definir SwitchPin 2 // Selección del mensaje del botón del puerto 12 #definir DelayTOPWROFF 500 #definir MinOPVoltage 3.4 // Direcciones de celda de memoria EEprom para configuración #definir EEFadeSeconds 993 #definir EEAdvertsecdelay 994 #definir EEAdvertMsg 995 #definir EEPINA 996 #definir EEPINC 997 #definir EEPINDD 998 Software Serial mySerial(7, 6); // RX, TX // LiquidCrystal (rs, enable, d4, d5, d6, d7) Cristal líquido lcd(8, 13, 12, 11, 10, 9); // variables byte DisplayBankContent = 0; // Manejo de entrada en serie char TBuffer; char Cbuffer[MaxInputBufferSize+1]; // búfer de entrada de código USB Cadena Sbuffer = ""; // búfer de entrada de cadena USB int valor; // búfer de entrada numérica USB byte Cuenta = 0; // Número de caracteres recibidos byte Intype = 0; booleano StrInput = falso; booleano NumberInput = falso; booleano DataInput = falso; booleano EnterInput = falso; byte MenueSelection = 0; // control de botón booleano Switchstate = cierto; booleano SwitchstateBuffer = cierto; byte SelectedMsg = 0; // Proporcione información de depuración a través de la interfaz serial booleano DebugMode = falso; booleano EchoMode = cierto; // EEPROM int dirección; // puntero de dirección EEPROM byte EEPromBanks = 0; // Utilizado para calcular los bancos EEPROM // SerMnueControl byte MnuState = 0; // Profundidad máxima del menú 255 icl sub byte Banco seleccionado =0; // reloj en tiempo real largo anteriorMillis = 0; // almacenará la última vez que se midió largo anteriorMillisB = 0; // almacenará la última vez que se midió // Gestión de pantallas booleano DisplayLock = falso; booleano Directprint = falso; byte DirectprintROW = 0; byte DirectprintLine = 0; booleano ActualizarDisplay = falso; byte FRMCheck = 0; // Se utiliza para escribir operaciones en eeprom, así que guarde los ciclos de host // monitoreo de la batería flotar Voltaje; booleano PowersaveMode = falso; // PWM Lichtsteuerung byte Brillo actual = 0; byte Brillo objetivo = 0; byte FadeSeconds = 0; // Estándar = 3 // Auto Display Z.B für Werbungszwecke booleano Publicidad = falso; byte AdvertMsg = 1; // Mínimo 1 byte Advertsecdelay = 0; // Estándar = 6 byte Advertseccounter = 0; vacío preparar() { EEPromBanks = EEpromSize / ((rLcdChr) * LcdRows); lcd.empezar(rLcdChr, LcdRows); lcd.claro(); lcd.setCursor(0, 0); lcd.impresión(" Bluetooth"); lcd.setCursor(0, 1); lcd.impresión(" Monitor"); mySerial.empezar(9600); pinMode(SwitchPin,INPUT_PULLUP); // Taster Auswahl Text aus EEprom pinMode(Luz de fondo,SALIDA); // Displaybeleuchtung / Display AN / AUS digitalWrite(Luz de fondo,BAJO); // leer Config FadeSeconds = EEPROM.leer(EEFadeSeconds); Advertsecdelay =EEPROM.leer(EEAdvertsecdelay); AdvertMsg =EEPROM.leer(EEAdvertMsg); Brillo actual = 0; Brillo objetivo = 0; lcd.setCursor(0, 4); Si (DisplayLock) { lcd.impresión("Sistema gesperrt"); } // Más rutinas de configuración / inicialización lcd.setCursor(0, 0); Brillo objetivo = 255; mySerial.rubor(); } // ###################################################################################################### // vacío lazo() { SerialcommandProcessor(); runrealTimeClock(); Procesador de pantalla(); SwitchProcessor(); // Fin del bucle principal } // ###################################################################################################### // vacío TextHeader(byte Rowm) { mySerial.println("Texto para el banco" + Cuerda( Banco seleccionado) + " FILA " + Cuerda (Rowm) + ":"); } vacío SerialcommandProcessor() { En t un; Intype = 0; Intype = SerInputHandler(); // 0 keine Rückgabe // 1 Nummer // 2 cuerdas // 3 datos Si ((Intype > 0) & (!Directprint)) { Si (Modo ahorro de energía) { TogglePowerSave(falso); } MenueSelection = 0; Si (Publicidad) { lcd.claro(); Publicidad = falso; mySerial.impresión(F("Publicidad")); mySerial.println(F(" APAGADO.")); } Si ((MnuState < 2) && (Intype == 2)) {Sbuffer.toUpperCase(); } // Para comandos de ingreso fácil Si ((Sbuffer == "DEPURAR") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 1;} Si ((Sbuffer == "ECO")&& (MnuState == 0) && (Intype == 2)) { MenueSelection = 2;} Si ((Sbuffer == "S") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 3;} // Borrar TODO el contenido de EEprom Si ((Sbuffer == "MI") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 4;} Si ((Sbuffer == "SI") && (MnuState == 1)&& (Intype == 2)) { MenueSelection = 5;} Si ((Sbuffer != "SI") && (MnuState == 1) && (Intype == 2)) { MenueSelection = 6;} // Editar contenido seleccionado Si ((Sbuffer == "W") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 7;} Si ((MnuState == 2) && (valor < EEPromBanks) && (Intype == 1)) { MenueSelection = 8;} Si (MnuState == 3) { MenueSelection = 9;} Si (MnuState == 4) { MenueSelection = 10;} // Mostrar contenido seleccionado Si ((Sbuffer == "PAG") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 11;} Si ((MnuState == 5) && (Intype == 1)) { MenueSelection = 12;} Si ((Sbuffer == "R") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 13;} Si ((MnuState == 6) && (Intype == 1)) { MenueSelection = 14;} Si ((Sbuffer == "RE") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 15;} Si ((Sbuffer == "Z") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 16;} Si ((Sbuffer == "SI") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 17;} Si ((MnuState == 7) && (Intype == 1)) { MenueSelection = 18;} Si ((Sbuffer == "DESVANECERSE") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 19;} Si (MnuState == 9) { MenueSelection = 20;} Si (MnuState == 10) { MenueSelection = 21;} Si ((Sbuffer == "UN") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 22;} Si ((Sbuffer == "PROPAGANDA") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 23;} Si (MnuState == 11) { MenueSelection = 24;} Si (MnuState == 12) { MenueSelection = 25;} Si ((Sbuffer == "ADSEC") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 26;} Si (MnuState == 13) { MenueSelection = 27;} Si ((Sbuffer == "ADMSG") && (MnuState == 0) && (Intype == 2)) { MenueSelection = 28;} Si (MnuState == 14) { MenueSelection = 29;} cambiar (MenueSelection) { caso 1: { mySerial.impresión("Depurar"); Modo de depuración = !Modo de depuración; Si (Modo de depuración) { mySerial.println(F(" EN.")); EchoMode = falso; } más { mySerial.println(F(" APAGADO.")); EchoMode = cierto; } mySerial.println(""); mySerial.rubor(); valor = 0; MnuState = 0; Sbuffer = ""; descanso; } caso 2: { mySerial.impresión(F("Eco ")); EchoMode = !EchoMode; Si (EchoMode) { mySerial.println(F(" EN.")); Modo de depuración = falso; } más { mySerial.println(F(" APAGADO.")); } mySerial.println(F("")); mySerial.rubor(); valor = 0; MnuState = 0; Sbuffer = ""; descanso; } caso 3: { mySerial.println(F("Leer contenido de EEEPROM:" )); mySerial.rubor(); para (En t un = 0; un < EEPromBanks; un++) { mySerial.println("Banco de memoria EEPROM:" + Cuerda(un) ); mySerial.rubor(); para (En t si = 1; si <= LcdRows;si++) { mySerial.impresión("Fila " + Cuerda(si) +": "); mySerial.rubor(); para (En t C = 0; C <rLcdChr; C++) { dirección = 0; dirección = (un * (rLcdChr)* LcdRows) + ((rLcdChr) * si) + C; valor = EEPROM.leer(dirección); mySerial.impresión(carbonizarse(valor)); mySerial.rubor(); } mySerial.println(F(" ")); mySerial.rubor(); } } Sbuffer = ""; mySerial.println(F("No más bancos EEPROM disponibles".)); mySerial.rubor(); descanso; } caso 4: { valor = 0; mySerial.impresión("Borrando EEPROM"); mySerial.println(F("SÍ NO:")); mySerial.rubor(); MnuState = 1; Sbuffer = ""; descanso; } caso 5: { valor = 0; mySerial.impresión(F("Borrando EEPROM")); mySerial.println(F("Colocarse.")); mySerial.rubor(); para (En t un = 0; un < EEPromBanks; un++) { // Banco de memoria a mySerial.println("Clear Bank:" + Cuerda(un)); para (En t si = 1; si <= LcdRows;si++) { para (En t C = 0; C <rLcdChr; C++) { dirección = 0; dirección = (un * (rLcdChr)* LcdRows) + ((rLcdChr ) * si) + C; FRMCheck = EEPROM.leer(dirección); Si (FRMCheck > 0) { EEPROM.escribir(dirección,00); // Formatierung mySerial.impresión("."); valor++; retrasar(30); mySerial.rubor(); } } } mySerial.println(""); mySerial.rubor(); } mySerial.println(""); mySerial.println("Terminado. "+ Cuerda(valor) + "Bytes borrados"); mySerial.println(""); mySerial.rubor(); Sbuffer = ""; MnuState = 0; descanso; } caso 6: { valor = 0; Sbuffer = ""; MnuState = 0; mySerial.println(F("OP abortar".)); mySerial.rubor(); descanso; } caso 7: { mySerial.println("Número de banco EEPPROM (0-" + Cuerda(EEPromBanks-1) + "):"); mySerial.rubor(); MnuState = 2; valor = 0; Sbuffer = ""; descanso; } caso 8: { Banco seleccionado = valor; TextHeader(1); MnuState = 3; Sbuffer = ""; valor = 0; descanso; } caso 9: { WriteEEPROM(Banco seleccionado,1); TextHeader(2); valor = 0; MnuState = 4; Sbuffer = ""; descanso; } caso 10: { WriteEEPROM(Banco seleccionado,2); valor = 0; MnuState = 0; Sbuffer = ""; TextHeader(3); mySerial.rubor(); valor = 0; MnuState = 9; Sbuffer = ""; descanso; } caso 11: { valor = 0; mySerial.println("Número de banco EEPPROM (0-" + Cuerda(EEPromBanks-1) + "):"); MnuState = 5; Sbuffer = ""; mySerial.rubor(); descanso; } caso 12: { SelectedMsg = valor; DisplayBank(valor); descanso; } caso 13: { valor = 0; mySerial.println("Número de banco EEPPROM (0-" + Cuerda(EEPromBanks-1) + "):"); MnuState = 6; Sbuffer = ""; mySerial.rubor(); descanso; } caso 14: { un = valor; Si ( un < EEPromBanks) { mySerial.println("Banco de memoria: " + Cuerda(un) ); mySerial.rubor(); para (En t si = 1; si <= LcdRows;si++) { mySerial.impresión("Fila " + Cuerda(si) +": "); mySerial.rubor(); para (En t C = 0; C <rLcdChr; C++) { dirección = 0; dirección = (un * (rLcdChr)* LcdRows) + ((rLcdChr) * si) + C; valor = EEPROM.leer(dirección); mySerial.impresión(carbonizarse(valor)); mySerial.rubor(); } mySerial.println(" "); mySerial.rubor(); } } más { mySerial.println(F("Valor fuera de rango.")); } valor = 0; Sbuffer = ""; MnuState = 0; descanso; } caso 15: { // pPrint directo para mostrar Directprint = cierto; mySerial.println ("Directprint activado".); Si (Directprint) { DirectprintROW = 0; DirectprintLine = 0; lcd.claro(); lcd.cursor(); lcd.parpadeo(); } valor = 0; Sbuffer = ""; MnuState = 0; descanso; } caso 16: { valor = 0; Sbuffer = ""; MnuState = 0; descanso; } caso 17: { mySerial.println(F("Brillo de pantalla: (máx. 255)")); MnuState = 7; valor = 0; Sbuffer = ""; descanso; } caso 18: { Si ((valor < 256)) { Brillo objetivo = valor; mySerial.println("Brillo:" + Cuerda (Brillo objetivo) + "Set"); } más { mySerial.println(F("Valor fuera de rango.")); } MnuState = 0; valor = 0; Sbuffer = ""; descanso; } caso 19: { mySerial.println(F("Retraso de desvanecimiento: (máx. 255 segundos)")); MnuState = 12; valor = 0; Sbuffer = ""; descanso; } caso 20: { WriteEEPROM(Banco seleccionado,3); valor = 0; MnuState = 0; Sbuffer = ""; TextHeader(4); mySerial.rubor(); valor = 0; MnuState = 10; Sbuffer = ""; descanso; } caso 21: { WriteEEPROM(Banco seleccionado,4); valor = 0; MnuState = 0; Sbuffer = ""; descanso; } caso 22: { MnuState = 0; Sbuffer = ""; mySerial.println(F("Introduzca NUEVO PIN BT")); mySerial.rubor(); MnuState = 11; descanso; } caso 23: { Publicidad = !Publicidad; mySerial.impresión(F("Publicidad")); Si (Publicidad) { mySerial.println(F(" EN.")); } más { mySerial.println(F(" APAGADO.")); } mySerial.rubor(); valor = 0; MnuState = 0; Sbuffer = ""; descanso; } caso 24: { Si ((valor > 1000) & (valor < 10000)) { mySerial.impresión("NUEVO PIN"+ Sbuffer); retrasar(1000); mySerial.rubor(); retrasar(1000); mySerial.println("AT + PIN"+ Sbuffer); retrasar(3000); mySerial.rubor(); } más { valor = 0; Sbuffer = ""; mySerial.println(F("Valor fuera de rango.")); } valor = 0; MnuState = 0; Sbuffer = ""; descanso; } caso 25: { Si ((valor > 0) & (valor < 251)) { FadeSeconds = valor; EEPROM.escribir(EEFadeSeconds, FadeSeconds); mySerial.println("Valor" + Cuerda (valor) + "conjunto"); } más { valor = 0; Sbuffer = ""; mySerial.println(F("Valor fuera de rango.")); } valor = 0; MnuState = 0; Sbuffer = ""; descanso; } caso 26: { mySerial.println(F("ADverDelay: (máximo 255 segundos)")); MnuState = 13; valor = 0; Sbuffer = ""; descanso; } caso 27: { Si ((valor > 0) & (valor < 256)) { Advertsecdelay = valor; EEPROM.escribir(EEAdvertsecdelay,Advertsecdelay); mySerial.println("Valor" + Cuerda (valor) + "conjunto"); } más { valor = 0; Sbuffer = ""; mySerial.println(F("Valor fuera de rango.")); } valor = 0; MnuState = 0; Sbuffer = ""; descanso; } caso 28: { mySerial.println("ADMsgs: (max" + Cuerda (EEPromBanks) + ")"); MnuState = 14; valor = 0; Sbuffer = ""; descanso; } caso 29: { Si ((valor > 0) & (valor < EEPromBanks +1)) { AdvertMsg = valor; EEPROM.escribir(EEAdvertMsg,AdvertMsg); mySerial.println("Valor" + Cuerda (valor) + "conjunto"); } más { valor = 0; Sbuffer = ""; mySerial.println(F("Valor fuera de rango.")); } valor = 0; MnuState = 0; Sbuffer = ""; descanso; } defecto: { Si (DisplayLock) { lcd.claro(); DisplayLock = falso; } mySerial.println(F("------- Pantalla inteligente Bluetooth 1.1 ------")); mySerial.println(F("S - Leer TODOS los bancos EEPROM")); mySerial.println(F("E - Borrar TODOS los bancos EEPROM")); mySerial.println(F("W - Escribir sel. EEPROM Bank")); mySerial.println(F("R - Leer sel. EEPROM Bank")); mySerial.println(F("P - Imprimir banco EEPROM en pantalla")); mySerial.println(F("----------------------------------------")); mySerial.println(F("D - Impresión directa")); mySerial.println("B - Valor actual del brillo de la pantalla:" + Cuerda (Brillo actual)); mySerial.println(F("----------------------------------------")); mySerial.println(F("A - PIN de acceso Bluetooth")); mySerial.println(F("Otros: ADVERTENCIA, ADSEC, ADMSG, FADE, ECHO")); mySerial.println(F("----------------------------------------")); mySerial.println(F("Escriba Cmd y presione Entrar")); mySerial.rubor(); Si (Modo de depuración) { mySerial.println("Depurar: CmdProc End Typ:" + Cuerda(Intype) + "Inhalar:" +Sbuffer); mySerial.rubor(); } MnuState = 0; valor = 0; Sbuffer = ""; } } } // Eingabe erkannt } vacío WriteEEPROM(byte FBank,byte Fow) { byte Contador de escritura; Contador de escritura = 0; mySerial.impresión("Ahorrando"); para (En t C = 0; C <rLcdChr; C++) { dirección = 0; dirección = (FBank * (rLcdChr)* LcdRows) + ((rLcdChr) * Fow) + C; valor = EEPROM.leer(dirección); Si (Sbuffer[C] != valor) { EEPROM.escribir(dirección,Sbuffer[C]); mySerial.impresión("."); Contador de escritura++; } } mySerial.println(" " + Cuerda (Contador de escritura) + "Bytes escritos".); } vacío ClearCBuffer () { para (byte un= 0; MaxInputBufferSize -1;un++) Cbuffer[un] = 0; } byte SerInputHandler() { byte resultado = 0; En t C; En t re; En t un; En t si; resultado = 0; Si (CheckforserialEvent()) { Si ((NumberInput) y no (Entrada de datos)y no (StrInput)) //Solo numeros { Sbuffer = ""; valor = 0; StrInput = falso; NumberInput = falso; Entrada de datos = falso; EnterInput = falso; un = 0; si = 0; C = 0; re = 0; Sbuffer = Cbuffer; // ¡Zahl wird AUCH! en SBUFFER übernommen, cae benötigt. Si (Cuenta == 1) { valor = Cbuffer[0]- 48 ; } Si (Cuenta == 2) { un = Cbuffer[0] - 48 ; un = un * 10; si = Cbuffer[1] - 48 ; valor = un + si; } Si (Cuenta == 3) { un = Cbuffer[0] - 48 ; un = un * 100; si = Cbuffer[1] - 48 ; si = si * 10; C = Cbuffer[2] - 48 ; valor = un + si + C; } Si (Cuenta == 4) { un = Cbuffer[0] - 48 ; un = un * 1000; si = Cbuffer[1] - 48 ; si = si * 100; C = Cbuffer[2] - 48 ; C = C * 10; re = Cbuffer[3] - 48 ; valor = un + si + C + re; } Si (Cuenta >= 5) { Sbuffer = ""; valor = 0; Sbuffer = Cbuffer; ClearCBuffer; resultado = 2; } más { ClearCBuffer; Si (Modo de depuración) { mySerial.println("Depuración: Número:"+Cuerda(valor)); mySerial.rubor(); } Cuenta = 0; resultado = 1; // Número Código de retorno NumberInput = falso; StrInput = falso; Entrada de datos = falso; EnterInput = falso; Cuenta = 0; regreso resultado; } } Si ((StrInput) y no (Entrada de datos)) // Solo entrada de cadena { Sbuffer = ""; Sbuffer = Cbuffer; Si (Modo de depuración) { mySerial.println("Depuración: Cadena:"+Sbuffer); mySerial.rubor(); } valor = 0; StrInput = falso; NumberInput = falso; Entrada de datos = falso; EnterInput = falso; Cuenta = 0; ClearCBuffer; resultado = 2; // Número Código de retorno } Si (Entrada de datos) { Sbuffer = ""; Sbuffer = Cbuffer; valor = 0; StrInput = falso; NumberInput = falso; Entrada de datos = falso; EnterInput = falso; Si (Modo de depuración) { mySerial.println("Depuración: Datos:"+Sbuffer); mySerial.rubor(); } Cuenta = 0; ClearCBuffer; resultado = 3; // Número Código de retorno } Si ((EnterInput) y no (StrInput) y no (NumberInput) y no (Entrada de datos)) { Sbuffer = ""; valor = 0; Si (Modo de depuración) { mySerial.println(F("Depuración: solo presione Intro")); mySerial.rubor(); } Cuenta = 0; ClearCBuffer; resultado = 4; // Número Código de retorno } NumberInput = falso; StrInput = falso; Entrada de datos = falso; EnterInput = falso; Cuenta = 0; regreso resultado; } regreso resultado; // Fin de CheckforSerialEvent } // Eingabebuffer booleano CheckforserialEvent() { mientras (mySerial.disponible()) { // obtener el nuevo byte: TBuffer = mySerial.leer(); Si (TBuffer > 9 && TBuffer < 14) { Cbuffer[Cuenta] = 0; TBuffer =0; Si (EchoMode) { mySerial.impresión(carbonizarse(13)); mySerial.rubor(); } Si (Directprint) { mySerial.println(""); DirectprintLine = 0; DirectprintROW = DirectprintROW + 1; Si ( DirectprintROW > 3) { Directprint = falso; lcd.noCursor(); lcd.noBlink(); Sbuffer = ""; valor = 0; } más { lcd.cursor(); lcd.parpadeo(); lcd.setCursor(0,DirectprintROW); } } Si (Modo de depuración) { mySerial.println("Depuración: Ingrese recibido. Longitud:" + Cuerda(Cuenta)); mySerial.rubor(); } EnterInput = cierto; regreso cierto; } más Si (TBuffer > 47 && TBuffer <58 ) { Si ( Cuenta < MaxInputBufferSize) { Cbuffer[Cuenta] = TBuffer; Cuenta++; Si ((Directprint)) { lcd.impresión(carbonizarse(TBuffer)); DirectprintLine = DirectprintLine + 1; Si ( Cuenta > MaxInputBufferSize -1) { lcd.noCursor(); lcd.noBlink(); } más { lcd.cursor(); lcd.parpadeo(); } } Si (EchoMode) { mySerial.impresión(carbonizarse(TBuffer)); mySerial.rubor(); } } más {mySerial.impresión("#"); } Si (Modo de depuración) { mySerial.println(F("Depuración: número sobre la serie recibida")); mySerial.rubor(); } // Entrada de número detectada NumberInput = cierto; } más Si (TBuffer > 64 && TBuffer < 123 ) { Si ( Cuenta < MaxInputBufferSize) { Cbuffer[Cuenta] = TBuffer; Cuenta++; Si ((Directprint)) { lcd.impresión(carbonizarse(TBuffer)); DirectprintLine = DirectprintLine + 1; Si ( Cuenta > MaxInputBufferSize -1) { lcd.noCursor(); lcd.noBlink(); } más { lcd.cursor(); lcd.parpadeo(); } } Si (EchoMode) { mySerial.impresión(carbonizarse(TBuffer)); mySerial.rubor(); } } más {mySerial.impresión("#"); } Si (Modo de depuración) { mySerial.println(F("Debug: Char over Serial recibido")); mySerial.rubor(); } Entrada de carácter Char detectada StrInput = Verdad; } Más Si ( (TBuffer == 127 ) | (TBuffer == 8 ) ) { Si ( DirectprintLine > 0 ) { DirectprintLine = DirectprintLine - 1; Lcd.setCursor(DirectprintLine, DirectprintROW); Lcd.Impresión(" "); Lcd.setCursor(DirectprintLine, DirectprintROW); } Si (( DirectprintLine == 0 ) & ( DirectprintROW > 0 )) { DirectprintROW = DirectprintROW - 1; DirectprintLine = rLcdChr -1; Lcd.setCursor(DirectprintLine, DirectprintROW); } Si ( Ccount > 0) { Ccount--; Cbuffer[Ccount] = 0; Si ((Directprint)) { Si ( Ccount > MaxInputBufferSize -1) { Lcd.noCursor(); Lcd.noBlink(); } Más { Lcd.Cursor(); Lcd.Parpadear(); } } Si (EchoMode) { mySerial.Impresión("-"); mySerial.rubor(); } } } Más { Si ( Ccount < MaxInputBufferSize) { Cbuffer[Ccount] = TBuffer; Ccount++; Si ((Directprint)) { DirectprintLine = DirectprintLine + 1; Si (TBuffer < 128) {Lcd.Impresión(Char(TBuffer)); } Más {Lcd.Impresión(Cadena(TBuffer)); } Si ( Ccount > MaxInputBufferSize -1) { Lcd.noCursor(); Lcd.noBlink(); } Más { Lcd.Cursor(); Lcd.Parpadear(); } } Si (EchoMode) { mySerial.Impresión(Char(TBuffer)); mySerial.rubor(); } } Más {mySerial.Impresión("#"); } Si (DebugMode) { mySerial.println(F("Depurar: Datos sobre serie recibidos")); mySerial.rubor(); } Entrada de datos detectada DataInput = Verdad; } devolución Falso; } devolución Falso; } Vacío Displayprocessor() Bei Blauem Display wird auf Scrollfunktion verzichtet, da das nur "schmiert" { Si (RefreshDisplay) { Lcd.Claro(); RefreshDisplay = Falso; Para (Int B = 1; B <= LcdRows;B++) { Lcd.setCursor(0, B -1); Si (!Publicidad) {mySerial.Impresión("Buena" + Cadena(B) +": "); } Para (Int C = 0; C <rLcdChr; C++) { eeaddress = 0; eeaddress = (DisplayBankContent * (rLcdChr)* LcdRows) + ((rLcdChr) * B) + C; Valor = 0; Valor = Eeprom.Leer(eeaddress); Si (Valor > 31) Sonderzeichen nicht anzeigen { Si (!Publicidad) { mySerial.Impresión(Char(Valor)); } Más { Retraso(100);} Lcd.Impresión(Char(Valor)); } Más { Lcd.Impresión(Char(32)); } } Si (!Publicidad) { mySerial.println(); } } } } Vacío runrealTimeClock() TIMEBASE { Reloj en tiempo real y cuenta atrás largo anteriorMillis - 0; almacenará la última vez se midió byte SecDivider - 0; Unsigned Largo currentMillis = Millis(); Int StepValue = 0; Pantalla PWM Steuerung StepValue = 4 * FadeSeconds; Si(currentMillis - anteriorMillis > StepValue) { anteriorMillis = currentMillis; Si (Currentbrightness < Targetbrightness ) { Currentbrightness = Currentbrightness + 1; analogWrite (BackgroundLight,Currentbrightness); } Más Si (Currentbrightness > Targetbrightness) { Currentbrightness = Currentbrightness - 1; analogWrite (BackgroundLight,Currentbrightness); } } Si(currentMillis - anteriorMillisB > 1000) { sekundentakt anteriorMillisB = currentMillis; BattMonitoring(); Publicidad Si (Publicidad) { Si (Advertseccounter > Advertsecdelay) { Advertseccounter = 0; DisplayBankContent = DisplayBankContent + 1; Si (DisplayBankContent > AdvertMsg - 1) { DisplayBankContent = 0; } RefreshDisplay = Verdad; } Más { Advertseccounter = Advertseccounter +1; } } } } Vacío DisplayBank ( Byte cobank) { Si (cobank < EePromBanks ) { RefreshDisplay = Verdad; Initalize Display Output DisplayBankContent = cobank; mySerial.println("Banco" + Cadena(cobank) + " se muestra en la pantalla LCD"); MnuState = 0; Sbuffer = ""; Valor =0; mySerial.rubor(); } Más { mySerial.println(F("Banco no disponible.")); Valor = 0; MnuState = 0; Sbuffer = ""; mySerial.rubor(); } } Vacío TogglePowerSave(Booleana Estado) { mySerial.Impresión("Modo Powersave"); Si (!Estado) { PowersaveMode = Falso; Targetbrightness = 255; mySerial.println(F("Off")); } Más { PowersaveMode = Verdad; Targetbrightness = 0; mySerial.println(F("ON")); } } Vacío SwitchProcessor() { Switchstate = digitalRead(SwitchPin); Si ((!Switchstate) && (SwitchstateBuffer) && (No DisplayLock))Abfrage Schalter { SwitchstateBuffer = falso; Publicidad = falso; Directprint = falso; lcd.noCursor(); lcd.noBlink(); Si (Modo ahorro de energía) { TogglePowerSave(falso); } más { SelectedMsg = SelectedMsg + 1; Si (SelectedMsg > EEPromBanks - 1 ) { SelectedMsg = 0; } lcd.claro(); lcd.setCursor(0,0); lcd.impresión("Banco:" + Cuerda(SelectedMsg) + "seleccionado"); lcd.setCursor(0,2); lcd.impresión("Sistema VDD:" + Cuerda(voltaje) + "V"); retrasar(10); valor = DelayTOPWROFF; mientras (digitalRead(SwitchPin) == 0) { retrasar(1); Si (valor > 0) {valor = valor - 1;}; Si (valor == 0 && no Modo ahorro de energía) { TogglePowerSave(cierto); // if (SelectedMsg = 0) {SelectedMsg = EEPromBanks;} else {SelectedMsg = SelectedMsg - 1;}; lcd.setCursor(0,3); lcd.impresión("Apagar bien"); } lcd.setCursor(0,3); Si (valor > 0) {lcd.impresión("Apagado: " + Cuerda(valor /100)+ "sec");}; } DisplayBank(SelectedMsg); } } Si (Switchstate) { SwitchstateBuffer = cierto; // retraso (10); } } vacío Corriente cortada () // Alternar apagado, si se alcanza el voltaje crítico. { lcd.claro(); lcd.setCursor(0,0); lcd.impresión("Advertencia de batería baja"); lcd.setCursor(0,2); lcd.impresión("Cargar batería."); Directprint = falso; Publicidad = falso; retrasar(5000); TogglePowerSave(cierto); } vacío BattMonitoring() { En t BatteryState; BatteryState = analogRead(VoltageSensingPin); // lee el pin de entrada // Mittelung der Messwerte noch hinzufügen voltaje = BatteryState * (0.00489); Si (voltaje <= MinOPVoltage) { Corriente cortada(); } }
Es wird jetzt nicht nur, wie vorher, die aktuell ausgewählte Text Bank angezeigt, sondern darüber hinaus jetzt die aktuelle Betriebsspannung. (Bild intern 4,97 Volt) sowie ein Counter, der beginnend mit 5 herunterzählt und bei Erreichen von 0 das System herunterfährt. Ebenso wird das System bei unterschreiben der im Quelltext angegeben Minimalbetriebsspannung heruntergefahren. Aktuell wird das Display zwar geleert, und die Hintergrundbeleuchtung abgeschaltet, es bleibt aber noch grundsätzlich mit Spannung versorgt. Wer möchte kann das Display per Feldeffekt Transistor auch noch spannungsfrei schalten. Ich habe aus Gründen der Einfachheit jedoch hierauf verzichtet.
Im Menü selbst ginbt es jetzt den „versteckten“ Befehl „debug“ der den Debug Modus durch einfache Eingabe des Befehls ein- und ausschaltet. Der nachfolgende Screenshot aus der Handy APP „BlueTerm“ die ich für dieses Projekt sehr empfehlen kann, sieht man die Zusatzausgaben (Markiert mit dem Prefix „Debug:“) die ausgegeben werden, wenn der Modus eingeschaltet ist. Im Screenshot sieht man die Debugausgabe aller über Serielle Schnittstelle empfangenen Zeichen. (Hier depuración)
Nach Empfang des Befehls debug wird der Debug Modus ausgeschaltet und mit „Debug OFF“ quittiert.
Ich wünsche viel Spaß beim Nachbauen. Bis calvo beim nächsten Blog und beim nächsten Projekt. Ich hoffe Ihr hattet so viel Spaß beim Nachbauen wie ich beim entwickeln.