Controlar la energía suministrada a una celda peltier

Hola que tal, trabajo por primera vez con arduino y he estado enrrollandome con hacer este problema y nada más no lo consigo. Tengo que controlar la energía suministrada a la celda peltier de manera proporcional al cambio de temperatura. Quiere decir que si en la caja se registra 8◦C la energía suministrada tiene que ser máxima, con el fin de bajar la temperatura, si en la caja se registra 2◦C la energía suministrada tiene que ser del 10%. Se cuenta con baterías de 12V.
También mostrar en una LCD la temperatura registrada en el sensor y con un botón cambiar a que muestre el porcentaje de la energía suministrada por la fuente y viceversa. Además de hacer uso de la comunicación serial.

Se hacer lo de la LCD y se que debo obtener el dato de la temperatura y convertirlo a digital, para despues evaluar con if dependiendo de que temperatura tenga.
Lo que no entiendo es la parte de suministrar energía, se que debo hacer uso de PWM, pero no me queda claro cómo hacerlo.
Les agradecería mucho su ayuda, adjunto el código que llevo:



#include <Wire.h>
#include<LiquidCrystal_I2C.h> // Libreria lcd

#define PWM 5 // Salida PWM
double volts = 0;
long temperatura; // temperatura
long milivolt; // milivolt
const int sensor=0; // variable sensor tipo const int y asignamos a pin analogico A0


//-----------------------------------------------------------
//Funcion Setup
//-----------------------------------------------------------
void setup()
{
Serial.begin(9600); // Llamamos la comunicación Serial con 9600 baudios
lcd.begin();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
delay(2000);
pinMode(PWM, OUTPUT);
analogWrite(PWM, 1);


pinMode(2,OUTPUT); // Configuramos el pin 2 como salida
pinMode(3,OUTPUT); // Configuramos el pin 3 como salida

digitalWrite(2,LOW); // Inicializamos el pin 2 en cero
digitalWrite(3,LOW); // Inicializamos el pin 3 en cero

}


void loop()
{
voltaje = (analogRead(A1)*(5.0 / 1023.0); //Conversion voltaje
milivolt = (analogRead(sensor) * 5000L) / 1023; // calculamos los milivolt
temperatura = milivolt / 10; // Conversion temperatura

Serial.print("Temperatura: "); // imprimimos temperatura en el monitor serial
Serial.print(temperatura); // imprimimos el contenido de la variable temperatura
Serial.println(" Grados"); // imprimimos grados en el monitor serial
delay(1500); // esperamos 1.5 segundos

if(temperatura == 8 )
{ // pregunta si la temperatura esta mayor o igual que 25 grados y menor o igual que 34 grados

}

if(temperatura == 2)
{ // pregunta si la temperatura es mayor o igual a 35 grados centigrados

}

}
 
Si buscas en el foro verás que son temas tratados muchas veces.
Por otra parte, además de que un control proporcional nunca va a funcionar per se, no cuentas el resto de cosas, la conexión ni el tamaño de la caja ni nada de nada.
¿O es que solo te preocupa el programa?

Respecto del programa haces una cosa pero en los comentarios dices otra. Mira la ayuda del if que lo explica. Tardarás un minuto o menos.
Usa un poco menos el cortapega y un poco más el cerebro.

El uso que haces de los tipos es como si un Arduino fuera un rizen 5700++. Un Arduino lleva una CPU pequeñita y hay que controlar los recursos.
Aparte de que dilapidado además usas los que no son, no te va a funcionar nada de nada. Lee que son y para que se usan los tipos.

Declaras long para cosas de 8 bits cuando int ya te sobra, puedes usar byte o Char.
Alegremente multiplicas y divides sin mirar si dan decimales o no, te vas a quedar con todos los resultados a 0. Como creo que no entiendes los tipos, no vas a saber por qué pero es evidente.

Resumidamente no cortapegues sin entender.

Mira los apuntes de clase, lee la ayuda de Arduino

Pista: lee la orden MAP.

C++:
#include <Wire.h>
#include<LiquidCrystal_I2C.h> // Libreria lcd

#define PWM 5 // Salida PWM
double volts = 0;                                               [B] ¿Por qué double, tanta precisión necesitas?[/B]
long temperatura; // temperatura  [B]¿Por qué long? ¿Hasta cuantos millones de grados llega la temperatura?¿No tiene decimales?¿Usas coma fija?[/B]
long milivolt; // milivolt
const int sensor=0; // variable sensor tipo const int y asignamos a pin analogico A0  [B] Puedes usar #define que no ocupa ram, no sé por qué PWM lo haces con define y sensor con const
[/B]

//-----------------------------------------------------------
//Funcion Setup
//-----------------------------------------------------------
void setup()
{
Serial.begin(9600); // Llamamos la comunicación Serial con 9600 baudios
lcd.begin();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
delay(2000);
pinMode(PWM, OUTPUT);
analogWrite(PWM, 1); [B] ¿1?Si es "analógico", 0 o 255 tiene sentido pero "1" no lo entiendo[/B]


pinMode(2,OUTPUT); // Configuramos el pin 2 como salida [B]¿Si los demás pines están definidos por qué estos no?[/B]
pinMode(3,OUTPUT); // Configuramos el pin 3 como salida

digitalWrite(2,LOW); // Inicializamos el pin 2 en cero
digitalWrite(3,LOW); // Inicializamos el pin 3 en cero

}


void loop()
{
voltaje = (analogRead(A1)*(5.0 / 1023.0); //Conversion voltaje  [B]¿Cuando has definido esta variable? Va a dar error. ¿Por qué este pin no está definido y el otro si, que hay conectado en A1?[/B]
milivolt = (analogRead(sensor) * 5000L) / 1023; // calculamos los milivolt [B]Va a dar cosas raras porque haces operaciones que dan resultados float con números enteros[/B]
temperatura = milivolt / 10; // Conversion temperatura

Serial.print("Temperatura: "); // imprimimos temperatura en el monitor serial
Serial.print(temperatura); // imprimimos el contenido de la variable temperatura
Serial.println(" Grados"); // imprimimos grados en el monitor serial
delay(1500); // esperamos 1.5 segundos

if(temperatura == 8 ) [B] ¿Estás seguro de que mayor o igual se escribe "==""?[/B]
{ // pregunta si la temperatura esta mayor o igual que 25 grados y menor o igual que 34 grados

}

if(temperatura == 2) [B]¿Estás seguro de que mayor o igual se escribe ==? ¿Si conviertes la temperatura antes por qué ahora es 2 en lugar de 35, o es que antes no convertías nada?[/B]
{ // pregunta si la temperatura es mayor o igual a 35 grados centigrados

}

}

Resumen.
No uses retardos para nada.
Usa timers e interrupciones.

Mira cómo están hechas las librerías que usas. Hay verdaderos vidrios en las librerías de Arduino.

La de motores paso a paso que era oficial era demencial 100%. Lo mismo hay alternativa o la han actualizado.
La de LCD no la he analizado pero me han contado que no es una joya. Creo que inhibir interrupciones porque interfiere con mi control de fase que va por interrupciones.
 
Última edición:
Atrás
Arriba