#include //Libreria para utilizar la memoria EEPROM, utilizada para guardar valores no volátiles //Constantes para manejo de LCD const int RS = 28; const int EN = 27; const int DB4 = 26; const int DB5 = 25; const int DB6 = 24; const int DB7 = 23; //Constantes para LORA const String lora_band = "915000000"; //Banda de frecuencia (Hz) const String lora_networkid = "18"; //red Lora const String lora_address = "1"; //Dirección del módulo Lora MASTER //Vairable para seleccion de modo int modo = 0; //Vairable para deteccion de encendido int estado = 0; void setup() { Serial.begin(115200); // Inicializar comunicacion serial configurar_pines(); // Definir entradas y salidas en el microcontrolador apagar_salidas(); // Apagar las salidas lcdInit(); // Inicializar el LCD seleccion_de_modo(); } void loop() { if (modo){ //CONFIGURACION LORA COMO MAESTRO lora_master(); } } void configurar_pines() { // Configuración de pines como salida pinMode(4, INPUT); // B4 - Boton 1 (incremento) pinMode(5, INPUT); // B5 - Boton 2 (decremento) pinMode(6, INPUT); // B6 - Boton 3 (confirmar) pinMode(11, INPUT); // B7 - Boton 4 (reset configuracion) //--------------------------------------------- pinMode(19, INPUT); // C17 - Eleccion de modo pinMode(14, OUTPUT); // C14 - LED indicador de envio de comandos pinMode(15, OUTPUT); // C15 - Desconexion/ conexion fotovoltaica pinMode(16, INPUT); // C16 - Deteccion de encendido } void apagar_salidas() { digitalWrite(14, LOW); // Apagar LED indicador de comandos digitalWrite(15, LOW); // Apagar desconexion } void seleccion_de_modo() { modo = digitalRead(19); // modo = 1 se configura como maestro, si es = 0 se configura como esclavo } void deteccion_de_encendido() { estado = digitalRead(16); // estado = 1 generador encendido, si es = 0 se generador apagdo } void lora_master(){ delay(1500); Serial.println("AT+BAND=" + lora_band); delay(500); Serial.println("AT+ADDRESS=" + lora_address); delay(500); Serial.println("AT+NETWORKID=" + lora_networkid); delay(1500); } void configurar_id_esclavos() { } void enviar_comando() { } void recibir_comando(){ } void reset_configuracion (){ } void timer () { // Configurar el Timer 1, para 10 segundos TCCR1A = 0; // Desactivar la configuración del registro TCCR1A TCCR1B = 0; // Desactivar la configuración del registro TCCR1B TCNT1 = 0; // Reiniciar el contador del Timer 1 // Establecer el valor de comparación para generar una interrupción cada 10 segundos OCR1A = 62499; // (16MHz / (256 * 10Hz)) - 1 // Configurar el prescaler a 256 para dividir la frecuencia del reloj TCCR1B |= (1 << CS12); // Habilitar la interrupción de comparación del Timer 1 TIMSK1 |= (1 << OCIE1A); // Iniciar el Timer 1 TCCR1B |= (1 << WGM12); // Modo CTC } //---------------------------------------------------------------------------------------------------------------------- // Enviar un comando al LCD void lcdCommand(unsigned char cmd) { digitalWrite(RS, LOW); // Configurar RS en bajo para enviar un comando digitalWrite(DB4, (cmd >> 0) & 1); // Enviar primeros 4 bits del comando digitalWrite(DB5, (cmd >> 1) & 1); digitalWrite(DB6, (cmd >> 2) & 1); digitalWrite(DB7, (cmd >> 3) & 1); digitalWrite(EN, HIGH); // pin EN para enviar los datos delayMicroseconds(1); digitalWrite(EN, LOW); delayMicroseconds(100); } // Inicialización del LCD void lcdInit() { pinMode(RS, OUTPUT); // Configurar los pines como salidas pinMode(EN, OUTPUT); pinMode(DB4, OUTPUT); pinMode(DB5, OUTPUT); pinMode(DB6, OUTPUT); pinMode(DB7, OUTPUT); lcdCommand(0x33); // Inicialización según datasheet lcdCommand(0x32); lcdCommand(0x28); // Modo de 4 bits, 2 líneas, matriz 5x8 lcdCommand(0x0C); // Mostrar cursor apagado, no parpadeo lcdCommand(0x06); // Incremento del cursor a la derecha lcdCommand(0x01); // Borrar pantalla delay(2); } // Escribir un carácter en el LCD void lcdWriteChar(unsigned char ch) { digitalWrite(RS, HIGH); // Configurar RS en alto para enviar datos digitalWrite(DB4, (ch >> 0) & 1); // Enviar primeros 4 bits del carácter digitalWrite(DB5, (ch >> 1) & 1); digitalWrite(DB6, (ch >> 2) & 1); digitalWrite(DB7, (ch >> 3) & 1); digitalWrite(EN, HIGH); // pin EN para enviar los datos delayMicroseconds(1); digitalWrite(EN, LOW); delayMicroseconds(100); } // Escribir una cadena de caracteres en el LCD void lcdPrint(const char* str) { while (*str) { lcdWriteChar(*str++); // Enviar cada carácter de la cadena } } // Posicionar el cursor en una posición específica del LCD void lcdSetCursor(int col, int row) { int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; // Offset de cada fila del LCD lcdCommand(0x80 | (col + row_offsets[row])); // Enviar comando para posicionar el cursor } //---------------------------------------------------------------------------------------------------------------------------------