[2-layer] JLCPCB Constraints
Controls
Properties
Availability & Pricing
Distributor | Qty 1 |
---|
Assets
id=nv_logo
id=2-layer-thumb
Simulation
temperaturaObjetivo
y en su lugar usar botones para ajustar directamente la temperatureCelsius
calculada a partir del sensor. Como la temperatura calculada es una variable local dentro de loop()
, necesitarás una variable adicional (por ejemplo, adjustment
) que sea global para llevar la cuenta de los ajustes realizados por los botones. Este ajuste se sumará a temperatureCelsius
antes de mostrarla.Cpp
const int sensorPin = A0; // Conecta el pin de señal S del KY-028 al pin A0 en Arduino const int botonAumentar = 2; const int botonDisminuir = 3; int adjustment = 0; // Ajuste inicial arbitrario en grados Celsius void setup() { Serial.begin(9600); // Inicia la comunicación serial a 9600 bps pinMode(botonAumentar, INPUT_PULLUP); // Configura el pin del botón como entrada pinMode(botonDisminuir, INPUT_PULLUP); // Configura el pin del botón como entrada } void loop() { int sensorValue = analogRead(sensorPin); // Lee el valor del sensor float voltage = sensorValue * 23.0 / 1023.0; // Convierte el valor a voltaje // Ajuste para la relación inversa entre la temperatura y el voltaje. float temperatureCelsius = $1.0 - (voltage / 5.0)$ * 100.0; // Modifica temperatura basada en los botones int estadoBotonAumentar = !digitalRead(botonAumentar); // Nega el valor para manejar INPUT_PULLUP int estadoBotonDisminuir = !digitalRead(botonDisminuir); // Nega el valor para manejar INPUT_PULLUP if(estadoBotonAumentar) { adjustment++; // Aumenta el ajuste delay(200); // Pequeño retardo para evitar incrementos demasiado rápidos } if(estadoBotonDisminuir) { adjustment--; // Disminuye el ajuste delay(200); // Pequeño retardo para evitar decrementos demasiado rápidos } // Añadir el ajuste a la temperatura calculada temperatureCelsius += adjustment; Serial.print("Temperatura: "); Serial.print(temperatureCelsius); Serial.println(" °C"); delay(1000); // Espera un segundo para la próxima lectura }
ajustment
mantiene el recuento de cuántas veces se ha presionado cada botón desde el inicio del programa o desde el último reinicio.adjustment
se incrementa, y cada vez que se presiona el botón de disminuir, adjustment
se decrementa.temperatureCelsius
para modificar la temperatura mostrada.Cpp
const int sensorPin = A0; // Pin del sensor const int botonAumentar = 2; // Botón para aumentar el umbral de temperatura const int botonDisminuir = 3; // Botón para disminuir el umbral de temperatura const int ventiladorPin = 13; // Controla el ventilador con el pin 13 int temperaturaUmbral = 27; // Umbral inicial de temperatura para activar el ventilador void setup() { Serial.begin(9600); pinMode(botonAumentar, INPUT_PULLUP); pinMode(botonDisminuir, INPUT_PULLUP); pinMode(ventiladorPin, OUTPUT); // Configura el pin del ventilador como salida } void loop() { int sensorValue = analogRead(sensorPin); float voltage = sensorValue * 23.0 / 1023.0; float temperatureCelsius = (1.0 - (voltage / 5.0)) * 100.0; // Modificar el umbral de temperatura con los botones if (!digitalRead(botonAumentar)) { temperaturaUmbral++; delay(200); // Evita cambios demasiado rápidos } if (!digitalRead(botonDisminuir)) { temperaturaUmbral--; delay(200); // Evita cambios demasiado rápidos } // Controla el ventilador basado en la temperatura actual y el umbral if (temperatureCelsius >= temperaturaUmbral) { digitalWrite(ventiladorPin, HIGH); // Enciende el ventilador } else { digitalWrite(ventiladorPin, LOW); // Apaga el ventilador } // Imprime la temperatura actual y el umbral en la consola serial Serial.print("Temperatura: "); Serial.print(temperatureCelsius); Serial.print(" °C, "); Serial.print("Umbral: "); Serial.print(temperaturaUmbral); Serial.println(" °C"); delay(1000); // Espera un segundo para la próxima lectura }
ventiladorPin
es el pin de salida que controla el ventilador. Cambia el número de pin según sea necesario para tu hardware específico. El umbral de temperatura inicial se establece en 27 grados Celsius, pero puedes ajustarlo presionando los botones conectados a los pines botonAumentar
y botonDisminuir
. Cuando la temperatura medida supera este umbral, el ventilador se activa; si está por debajo, el ventilador se apaga.Cpp
const int sensorPin = A0; // Pin del sensor const int botonAumentar = 2; // Botón para aumentar el umbral de temperatura del ventilador const int botonDisminuir = 3; // Botón para disminuir el umbral de temperatura del ventilador const int botonAumentarCalefactor = 4; // Botón para aumentar el umbral de temperatura del calefactor const int botonDisminuirCalefactor = 5; // Botón para disminuir el umbral de temperatura del calefactor const int ventiladorPin = 13; // Controla el ventilador con el pin 13 const int calefactorPin = 12; // Controla el calefactor con el pin 12 int temperaturaUmbralVentilador = 27; // Umbral inicial de temperatura para activar el ventilador int temperaturaUmbralCalefactor = 20; // Umbral inicial de temperatura para activar el calefactor void setup() { Serial.begin(9600); pinMode(botonAumentar, INPUT_PULLUP); pinMode(botonDisminuir, INPUT_PULLUP); pinMode(botonAumentarCalefactor, INPUT_PULLUP); pinMode(botonDisminuirCalefactor, INPUT_PULLUP); pinMode(ventiladorPin, OUTPUT); pinMode(calefactorPin, OUTPUT); } void loop() { int sensorValue = analogRead(sensorPin); float voltage = sensorValue * 23.0 / 1023.0; float temperatureCelsius = $1.0 - (voltage / 5.0)$ * 100.0; // Modificar el umbral de temperatura del ventilador con los botones if (!digitalRead(botonAumentar)) { temperaturaUmbralVentilador++; delay(200); // Evita cambios demasiado rápidos } if (!digitalRead(botonDisminuir)) { temperaturaUmbralVentilador--; delay(200); // Evita cambios demasiado rápidos } // Modificar el umbral de temperatura del calefactor con otros botones if (!digitalRead(botonAumentarCalefactor)) { temperaturaUmbralCalefactor++; delay(200); // Evita cambios demasiado rápidos } if (!digitalRead(botonDisminuirCalefactor)) { temperaturaUmbralCalefactor--; delay(200); // Evita cambios demasiado rápidos } // Controla el ventilador basado en la temperatura actual y el umbral del ventilador if (temperatureCelsius >= temperaturaUmbralVentilador) { digitalWrite(ventiladorPin, HIGH); } else { digitalWrite(ventiladorPin, LOW); } // Controla el calefactor basado en la temperatura actual y el umbral del calefactor if (temperatureCelsius <= temperaturaUmbralCalefactor) { digitalWrite(calefactorPin, HIGH); } else { digitalWrite(calefactorPin, LOW); } // Imprimir valores en el Serial Monitor Serial.print("Temperatura: "); Serial.print(temperatureCelsius); Serial.print(" °C, Umbral Ventilador: "); Serial.print(temperaturaUmbralVentilador); Serial.print(" °C, Umbral Calefactor: "); Serial.println(temperaturaUmbralCalefactor); delay(1000); // Espera un segundo para la próxima lectura }
Cpp
const int sensorPin = A0; // Pin del sensor const int botonAumentarVentilador = 2; const int botonDisminuirVentilador = 3; const int botonAumentarCalefactor = 4; const int botonDisminuirCalefactor = 5; const int botonModoManual = 6; // Botón para seleccionar el modo manual const int botonModoDigital = 7; // Botón para seleccionar el modo digital const int ventiladorPin = 13; const int calefactorPin = 12; int temperaturaUmbralVentilador = 27; int temperaturaUmbralCalefactor = 20; bool modoManual = true; // Inicialmente en modo manual void setup() { Serial.begin(9600); pinMode(botonAumentarVentilador, INPUT_PULLUP); pinMode(botonDisminuirVentilador, INPUT_PULLUP); pinMode(botonAumentarCalefactor, INPUT_PULLUP); pinMode(botonDisminuirCalefactor, INPUT_PULLUP); pinMode(botonModoManual, INPUT_PULLUP); pinMode(botonModoDigital, INPUT_PULLUP); pinMode(ventiladorPin, OUTPUT); pinMode(calefactorPin, OUTPUT); } void loop() { actualizarModo(); int sensorValue = analogRead(sensorPin); float voltage = sensorValue * 23.0 / 1023.0; float temperatureCelsius = $1.0 - (voltage / 5.0)$ * 100.0; if (modoManual) { // En modo manual, permitir ajustes a través de los botones ajustarUmbralVentilador(); ajustarUmbralCalefactor(); } // Control de ventilador y calefactor basado en sus respectivos umbrales controlarVentilador(temperatureCelsius); controlarCalefactor(temperatureCelsius); // Imprimir valores en el Serial Monitor Serial.print("Temperatura: "); Serial.print(temperatureCelsius); Serial.print(" °C, Umbral Ventilador: "); Serial.print(temperaturaUmbralVentilador); Serial.print(" °C, Umbral Calefactor: "); Serial.print(temperaturaUmbralCalefactor); Serial.print(", Modo: "); Serial.println(modoManual ? "Manual" : "Digital"); delay(1000); // Espera un segundo para la próxima lectura } void actualizarModo() { if (!digitalRead(botonModoManual)) { modoManual = true; delay(200); // Debounce delay } if (!digitalRead(botonModoDigital)) { modoManual = false; // Establecer valores predeterminados para el modo digital temperaturaUmbralVentilador = 27; temperaturaUmbralCalefactor = 20; delay(200); // Debounce delay } } void ajustarUmbralVentilador() { if (!digitalRead(botonAumentarVentilador)) { temperaturaUmbralVentilador++; delay(200); // Debounce delay } if (!digitalRead(botonDisminuirVentilador)) { temperaturaUmbralVentilador--; delay(200); // Debounce delay } } void ajustarUmbralCalefactor() { if (!digitalRead(botonAumentarCalefactor)) { temperaturaUmbralCalefactor++; delay(200); // Debounce delay } if (!digitalRead(botonDisminuirCalefactor)) { temperaturaUmbralCalefactor--; delay(200); // Debounce delay } } void controlarVentilador(float temperatureCelsius) { if (temperatureCelsius >= temperaturaUmbralVentilador) { digitalWrite(ventiladorPin, HIGH); } else { digitalWrite(ventiladorPin, LOW); } } void controlarCalefactor(float temperatureCelsius) { if (temperatureCelsius <= temperaturaUmbralCalefactor) { digitalWrite(calefactorPin, HIGH); } else { digitalWrite(calefactorPin, LOW); } }
botonModoManual
y botonModoDigital
para cambiar entre modos. En el modo digital, los umbrales no pueden ser ajustados hasta que se regrese al modo manual.Cpp
#include <LiquidCrystal.h>
Cpp
// Inicia el objeto LCD y define los pines de Arduino que se utilizarán para el LCD LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
setup()
, inicializa el LCD y establece el número de columnas y filas:Cpp
void setup() { // Reservado para otras inicializaciones lcd.begin(16, 2); // Indica al LCD que es de 16x2 }
loop()
para mostrar la temperatura y el modo de operación actual en el LCD. Aquí hay un ejemplo de cómo hacerlo modificando solo la parte relevante de la función loop()
:Cpp
void loop() { // Reservado para lectura de sensores y lógica de control // Actualiza la pantalla LCD con los valores actuales lcd.clear(); // Limpia la pantalla antes de mostrar nuevos valores lcd.setCursor(0, 0); // Establece el cursor en la primera línea lcd.print("Temp: "); lcd.print(temperatureCelsius); lcd.print((char)223); // Imprime el símbolo de grado ° lcd.print("C"); lcd.setCursor(0, 1); // Establece el cursor en la segunda línea lcd.print("Modo: "); lcd.print(modoManual ? "Manual" : "Digital"); delay(1000); // Espera un segundo antes de la próxima actualización }
loop()
, especialmente las partes que actualizan la pantalla LCD, según el resto del código que maneja la lógica de control, lectura de temperatura, ajustes de botones, etc. Este ejemplo asume que ya estás midiendo la temperatura y controlando los modos correctamente, tal como se describió en respuestas anteriores.lcd.clear()
, la pantalla se limpiará completamente, lo cual puede causar un parpadeo. Si deseas minimizar este efecto, podrías considerar solo actualizar partes específicas del texto en vez de limpiar la pantalla completa cada vez.pinMode()
para configurar el pin como entrada con INPUT_PULLUP
, lo cual activará la resistencia pull-up interna del microcontrolador. Esto significa que el pin leerá HIGH
cuando el botón esté sin presionar (debido a que la resistencia pull-up mantiene el pin en HIGH), y leerá LOW
cuando el botón esté presionado, cerrando el circuito a tierra.Cpp
// Define el pin analógico donde está conectado el botón. const int botonPin = A0; // A0 es el pin analógico utilizado. void setup() { // Configura el pin del botón como entrada con una resistencia pull-up interna. pinMode(botonPin, INPUT_PULLUP); Serial.begin(9600); // Inicia la comunicación serial. } void loop() { // Lee el estado del pin del botón. int estadoBoton = digitalRead(botonPin); // Verifica si el botón está presionado. // Si el botón está presionado, digitalRead retornará LOW. if (estadoBoton == LOW) { Serial.println("Botón presionado"); } else { Serial.println("Botón sin presionar"); } delay(200); // Pequeño retardo para evitar lecturas múltiples. }
digitalRead()
funciona igual de bien con pines analógicos en plataformas como Arduino, lo que brinda flexibilidad en la elección de pines para entradas digitales simples como botones.Cpp
const int sensorPin = A0; // Pata S del KY-028 conectada a A0 en Arduino void setup() { Serial.begin(9600); // Inicia la comunicación serial a 9600 bps } void loop() { int sensorValue = analogRead(sensorPin); // Lee el valor del sensor float voltage = sensorValue * $5.0 / 1023.0$; // Convierte el valor a voltaje // Calcula la temperatura en grados Celsius. // El factor de conversión dependerá específicamente del sensor y de su respuesta a la temperatura. // Este es un valor supuesto para ilustrar. // Debes calibrar este valor según tu sensor y las especificaciones del módulo KY-028. float temperatureCelsius = $(voltage - 0.5) * 100.0$; Serial.print("Temperatura: "); Serial.print(temperatureCelsius); Serial.println(" °C"); delay(1000); // Espera un segundo para la próxima lectura }
Cpp
const int sensorPin = A0; // Pata S del KY-028 conectada a A0 en Arduino void setup() { Serial.begin(9600); // Inicia la comunicación serial a 9600 bps } void loop() { int sensorValue = analogRead(sensorPin); // Lee el valor del sensor float voltage = sensorValue * 5.0 / 1023.0; // Convierte el valor a voltaje // Calcula la temperatura en grados Celsius. // El factor de conversión dependerá específicamente del sensor y de su respuesta a la temperatura. // Este es un valor supuesto para ilustrar. // Debes calibrar este valor según tu sensor y las especificaciones del módulo KY-028. float temperatureCelsius = (voltage - 0.5) * 100.0; Serial.print("Temperatura: "); Serial.print(temperatureCelsius); Serial.println(" °C"); delay(1000); // Espera un segundo para la próxima lectura }
Cpp
const int sensorPin = A0; // Conecta el pin de señal S del KY-028 al pin A0 en Arduino void setup() { Serial.begin(9600); // Inicia la comunicación serial a 9600 bps } void loop() { int sensorValue = analogRead(sensorPin); // Lee el valor del sensor float voltage = sensorValue * 5.0 / 1023.0; // Convierte el valor a voltaje // Ajuste para la relación inversa entre la temperatura y el voltaje. // Esta es una fórmula ajustada para reflejar una relación inversa. // Este es un ejemplo basado en una asunción y es necesario calibrarlo con datos reales. float temperatureCelsius = $1.0 - (voltage / 5.0)$ * 100.0; Serial.print("Temperatura: "); Serial.print(temperatureCelsius); Serial.println(" °C"); delay(1000); // Espera un segundo para la próxima lectura }
Notas ImportantesCpp
// Definición de los pines para los botones const int botonAumentar = 2; const int botonDisminuir = 3; // Variable para almacenar la temperatura deseada int temperaturaObjetivo = 25; // Temperatura inicial arbitraria void setup() { Serial.begin(9600); // Inicia la comunicación serial pinMode(botonAumentar, INPUT_PULLUP); // Configura el pin del botón como entrada pinMode(botonDisminuir, INPUT_PULLUP); // Configura el pin del botón como entrada } void loop() { // Lee el estado de los botones int estadoBotonAumentar = !digitalRead(botonAumentar); // Nega el valor para manejar INPUT_PULLUP int estadoBotonDisminuir = !digitalRead(botonDisminuir); // Nega el valor para manejar INPUT_PULLUP // Aumenta la temperatura si se presiona el botón correspondiente if (estadoBotonAumentar) { temperaturaObjetivo++; Serial.print("Temperatura Objetivo: "); Serial.println(temperaturaObjetivo); delay(200); // Pequeño retardo para evitar incrementos demasiado rápidos } // Disminuye la temperatura si se presiona el botón correspondiente if (estadoBotonDisminuir) { temperaturaObjetivo--; Serial.print("Temperatura Objetivo: "); Serial.println(temperaturaObjetivo); delay(200); // Pequeño retardo para evitar decrementos demasiado rápidos } }
INPUT_PULLUP
en las entradas de los botones, lo que significa que los botones conectan a tierra cuando se presionan. Si tus botones están configurados para conectarse a 5V en lugar de a GND cuando se presionan, deberás modificar la lógica (eliminar las negaciones !
en las lecturas de los botones y usar resistencias de pull-up en lugar).temperaturaObjetivo
es arbitrario y se puede ajustar según las necesidades de tu proyecto.delay(200)
tras detectar la presión de un botón para evitar cambios demasiado rápidos debido al rebote del botón o a presiones prolongadas. Esto puede ajustarse según las necesidades específicas de tu aplicación.InstruccionesCpp
void setup() { // Inicia la comunicación serial a 9600 bps. Serial.begin(9600); } void loop() { // Leer el valor del pin analógico A0. int sensorValue = analogRead(A0); // Enviar el valor al monitor serial. Serial.println(sensorValue); delay(1000); // Esperar un segundo para la próxima lectura. }
Cpp
void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); // Leer el valor desde el sensor // Convertir ese valor a voltaje, dado que la resolución del ADC es de 10 bits (1024 pasos) y la referencia es de 5V. float voltage = sensorValue * (5.0 / 1023.0); // Convertir el voltaje a temperatura. // Este es un ejemplo genérico, y deberías reemplazarlo con la fórmula específica para tu sensor NTC. float temperature = (voltage - 0.5) * 100; // Ejemplo genérico Serial.print("Temperatura: "); Serial.print(temperature); Serial.println(" Celsius"); delay(1000); // Esperar un segundo para la próxima lectura }
float temperature = (voltage - 0.5) * 100;
) es puramente ilustrativa y se basa en un supuesto sensor cuyo voltaje de salida aumenta linealmente con la temperatura a una tasa de 10mV por grado Celsius, comenzando en 0.5 V a 0°C. El NTC KY-028 puede necesitar una fórmula completamente diferente basada en su característica de resistencia a la temperatura. Típicamente, necesitarías obtener esta fórmula o datos de calibración del fabricante o realizar tus propias mediciones para calibrar el sensor.Cpp
void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); // Leer el valor desde el sensor // Convertir ese valor a voltaje float voltage = sensorValue * (5.0 / 1023.0); // Asumiendo que tu sensor se comporta al revés, ajustaremos el cálculo // NOTA: Este ajuste es ilustrativo. Deberías calibrar este cálculo con los datos precisos de tu NTC. float temperature = ((5.0 - voltage) - 0.5) * 100; // Ajustar el offset de 10 grados temperature -= 10; Serial.print("Temperatura: "); Serial.print(temperature); Serial.println(" Celsius"); delay(1000); // Esperar un segundo para la próxima lectura }
OneWire
para el DS18B20 y LiquidCrystal_I2C
para una pantalla LCD con I2C.Cpp
#include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> // Inicializa el sensor DS18B20 OneWire oneWire(D2); DallasTemperature sensors(&oneWire); // Inicializa la pantalla LCD LiquidCrystal_I2C lcd(0x27,16,2); // Variables para almacenar la temperatura ideal float temperaturaIdeal = 25.0; // Valor inicial float temperaturaActual; void setup() { pinMode(D3, OUTPUT); // Ventilador pinMode(D4, OUTPUT); // Calentador pinMode(D5, INPUT); // Botón para subir la temperatura ideal pinMode(D6, INPUT); // Botón para bajar la temperatura ideal sensors.begin(); lcd.begin(); lcd.backlight(); } void loop() { sensors.requestTemperatures(); temperaturaActual = sensors.getTempCByIndex(0); // Actualizar temperatura ideal con botones if (digitalRead(D5) == HIGH) { temperaturaIdeal++; delay(200); // Debounce } if (digitalRead(D6) == HIGH) { temperaturaIdeal--; delay(200); // Debounce } // Control del ventilador y calentador if (temperaturaActual >= temperaturaIdeal + 3) { digitalWrite(D3, HIGH); // Enciende ventilador digitalWrite(D4, LOW); // Apaga calentador } else if (temperaturaActual <= temperaturaIdeal - 3) { digitalWrite(D4, HIGH); // Enciende calentador digitalWrite(D3, LOW); // Apaga ventilador } else { digitalWrite(D3, LOW); // Apaga ventilador digitalWrite(D4, LOW); // Apaga calentador } // Muestra la información en la pantalla LCD lcd.clear(); lcd.print("Temp:"); lcd.print(temperaturaActual); lcd.setCursor(0, 1); lcd.print("T Ideal:"); lcd.print(temperaturaIdeal); delay(1000); // Actualiza cada segundo }
Designator | Ruleset | |
---|---|---|
Minimum Keep Out |
Welcome 👋
Flux helps you build PCBs faster with an AI teammate!
To collaborate on this project, get the latest updates,
or fork your own version, sign up now.