/* * Ejemplo de control de sensor de temperatura, luminosidad y alertas con zumbador y NeoPixels * para la placa NeoFan de FANIOT. * * Este programa lee la temperatura de un sensor HTU21D y la luminosidad de un sensor LDR. * Si la temperatura supera los 30°C, se activan los NeoPixels en color rojo. * Si la temperatura es mayor a 25°C y menor o igual a 30°C, los NeoPixels se encienden en verde. * Si la temperatura es mayor a 20°C y menor o igual a 25°C, los NeoPixels se encienden en azul. * Además, si la luminosidad es menor a 50%, se activa un zumbador. * * Requisitos: * - Librerías: Wire, Adafruit_GFX, Adafruit_SSD1306, Adafruit_NeoPixel, Adafruit_HTU21DF * - Hardware: Placa NeoFan, sensor HTU21D, LDR, zumbador, NeoPixels, pantalla OLED */ #include #include #include #include #include #define LDR_PIN 39 // Pin del sensor LDR #define BUZZER_PIN 12 // Pin del zumbador #define NEO_PIN 27 // Pin del NeoPixel #define NEO_COUNT 4 // Número de NeoPixels #define OLED_WIDTH 128 // Ancho de la pantalla OLED #define OLED_HEIGHT 64 // Alto de la pantalla OLED Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, -1); // Inicialización de la pantalla OLED Adafruit_HTU21DF htu = Adafruit_HTU21DF(); // Inicialización del sensor HTU21D Adafruit_NeoPixel pixels(NEO_COUNT, NEO_PIN, NEO_GRB + NEO_KHZ800); // Inicialización de los NeoPixels void setup() { Serial.begin(9600); // Inicializamos la comunicación serial // Inicializamos la pantalla OLED if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("No se encontró una pantalla SSD1306")); while (true); } display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); // Inicializamos el sensor de temperatura HTU21D if (!htu.begin()) { Serial.println(F("Error al iniciar el sensor HTU21D")); while (true); } // Inicializamos los NeoPixels pixels.begin(); pixels.setBrightness(20); // Ajustamos el brillo al 20% // Inicializamos el pin del zumbador como salida pinMode(BUZZER_PIN, OUTPUT); Serial.println(F("Sistema inicializado")); } void loop() { // Leemos la temperatura del sensor HTU21D float temperature = htu.readTemperature(); // Leemos la luminosidad del sensor LDR y la convertimos a porcentaje int luminosity = map(analogRead(LDR_PIN), 4095, 0, 100, 0); // Control de NeoPixels según la temperatura controlNeoPixels(temperature); // Control del zumbador según la luminosidad controlBuzzer(luminosity); // Actualizamos la pantalla OLED updateDisplay(temperature); // Enviamos los datos al monitor serial Serial.print(F("Luz ambiental: ")); Serial.print(luminosity); Serial.println(F("%")); delay(500); // Esperamos 500 milisegundos por cada lectura } /** * Controla los NeoPixels según la temperatura. * @param temperature La temperatura leída del sensor. */ void controlNeoPixels(float temperature) { if (temperature > 30) { setNeoPixelsColor(255, 0, 0); // Rojo } else if (temperature > 25) { setNeoPixelsColor(0, 255, 0); // Verde } else if (temperature > 20) { setNeoPixelsColor(0, 0, 255); // Azul } else { setNeoPixelsColor(0, 0, 0); // Apagado } } /** * Configura el color de todos los NeoPixels. * @param r Componente rojo del color. * @param g Componente verde del color. * @param b Componente azul del color. */ void setNeoPixelsColor(uint8_t r, uint8_t g, uint8_t b) { for (int i = 0; i < NEO_COUNT; i++) { pixels.setPixelColor(i, pixels.Color(r, g, b)); } pixels.show(); } /** * Controla el zumbador según la luminosidad. * @param luminosity La luminosidad leída del sensor LDR. */ void controlBuzzer(int luminosity) { if (luminosity < 5) { tone(BUZZER_PIN, 1000); // Activamos el zumbador con una frecuencia de 1000 Hz } else { noTone(BUZZER_PIN); // Desactivamos el zumbador } } /** * Actualiza la pantalla OLED con la temperatura actual. * @param temperature La temperatura leída del sensor. */ void updateDisplay(float temperature) { display.clearDisplay(); display.setCursor(0, 10); display.print(F("T: ")); display.print(temperature); display.print(F(" C")); display.display(); }