/* * Ejemplo de control de sensor de temperatura, luminosidad y alertas con zumbador y NeoPixels * para la placa KitMaker de FANIOT. * * Este programa lee la temperatura de un sensor DS18B20 conectado al pin 19 y la luminosidad de un sensor LDR * conectado al pin 39. 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 conectado al pin 14. * * Requisitos: * - Librerías: OneWire, DallasTemperature, Adafruit_GFX, Adafruit_SSD1306, Adafruit_NeoPixel * - Hardware: Placa KitMaker, sensor DS18B20, LDR, zumbador, NeoPixels, pantalla OLED */ #define LDR_PIN 39 // Pin del sensor LDR #define BUZZER_PIN 14 // Pin del zumbador #define NEO_PIN 27 // Pin del NeoPixel #define NEO_COUNT 4 // Número de NeoPixels #define TEMP_PIN 19 // Pin del sensor de temperatura DS18B20 #define OLED_WIDTH 128 // Ancho de la pantalla OLED #define OLED_HEIGHT 32 // Alto de la pantalla OLED #include #include #include #include #include #include // Objetos de sensores y display OneWire oneWire(TEMP_PIN); DallasTemperature sensors(&oneWire); Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, -1); Adafruit_NeoPixel pixels(NEO_COUNT, NEO_PIN, NEO_GRB + NEO_KHZ800); void setup() { // Inicializamos la comunicación serial Serial.begin(9600); // Inicializamos la librería DallasTemperature sensors.begin(); // Inicializamos la librería NeoPixel pixels.begin(); pixels.setBrightness(20); // Ajustamos el brillo al 20% // Inicializamos el pin del zumbador como salida pinMode(BUZZER_PIN, OUTPUT); // 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); Serial.println(F("Sistema inicializado")); } void loop() { // Leemos la temperatura del sensor DS18B20 sensors.requestTemperatures(); float temperature = sensors.getTempCByIndex(0); // 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 < 50) { 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(); }