Hola, a todos soy un aficionado al aeromodelismo y sobre todo a la construcción de planeadores, ultimamente estoy construyendo modelos enfibrados y para ello utilizo una bomba de vacío para curar las piezas dentro de una bolsa, el tema es que vi por la red un sistema para activar la bomba de vacio por medio de un arudino uno, un sensor de presión y un relé, justo lo que necesito para controlar el vacío que aplico.
He empezado haciendo varios tutoriales de iniciación ya que nunca había tocado arduino, pero la curva de aprendizaje esta siendo muy lenta por el tiempo que le puedo dedicar, ya tengo los componentes:
Placa arduino uno
LCD 16x2 Keypad shield
BMP 180
Rele AVR DSP ARM 10A
Las funciones del vacuostato seria mostrar la presión actual, presión programada, Bomba ON OFF AUTO, Histeresis de un 20%, y poder programar un tiempo máximo de funcionamiento, si consigo hacer esto realidad me gustaría implementar con un sensor de temperatura que me proteja el compresor si hay una fuga y nunca alcanza el vacío programado.
El tema de conexión es bastante simple y esta bien explicado por la red, donde tengo el gran problema es que no se por donde empezar el código, si alguien me puede orientar estaría muy agradecido, mientras tanto seguiré buscando por tutoriales.
Un saludo.
He encontrado este código que es lo que me gustaría hacer pero no tengo muy claro como adaptarlo a mi hardware
#include <WString.h>
#include <MiSLCD.h>
#define numRows 2
#define numCols 16
MiSLCD lcd = MiSLCD(numRows, numCols);
int val_sensor = 0;
int val_pin = 0;
float vol_sensor = 0;
float presion = 0;
float consigna = 0.0;
float delta;
int histeresis = 20;
int pulsador_up = 0;
int pulsador_dw = 0;
int pulsador_pr = 0;
// Variables de estado
byte compresor = 0;
byte m_auto = 1;
byte m_stop = 0;
// Salidas
int CompresorPin = 7;
// Entradas
// Digitales
int AutoPin = 2;
int StopPin = 3;
int UpPin = 5;
int DwPin = 4;
int ProgPin = 6;
// Analogicas
int SensorPin = 0;
String str;
char buffer[32];
void setup()
{
//Inicializacion de la pantalla
lcd.init();
//Mostramos version
lcd.clear();
lcd.print(" VACUOSTATO 0.1 ",0,0);
lcd.print("rcmodelistas.es ",1,0);
//Salidas digitales
pinMode(CompresorPin,OUTPUT);
//Entradas digitales
pinMode(AutoPin,INPUT);
pinMode(StopPin,INPUT);
pinMode(UpPin,INPUT);
pinMode(DwPin,INPUT);
pinMode(ProgPin,INPUT);
delay(5000);
lcd.clear();
}
void loop()
{
LeeInterruptores();
LeePulsadores();
LeeSensorPresion();
CalculaSalida();
MuestraDatosSonda();
}
void LeeInterruptores(){
val_pin = digitalRead(StopPin);
if (val_pin == LOW){
m_stop = 0;
}
else{
m_stop = 1;
setCompresor(0);
}
val_pin = digitalRead(AutoPin);
if (val_pin == LOW){
if(m_auto == 1){
m_auto = 0;
setCompresor(0);
}
}
else{
m_auto = 1;
}
MuestraEstado();
}
void LeePulsadores(){
if( m_stop == 1 || m_auto == 1){
// Pulsador UP
val_pin = digitalRead(UpPin);
if (val_pin == LOW){
//Subimos consigna
consigna += 0.01;
if (consigna > 0){
consigna = 0;
}
MuestraConsigna();
}
// Pulsador DOWN
val_pin = digitalRead(DwPin);
if (val_pin == LOW){
//Bajamos consigna
consigna -= 0.01;
if (consigna < -1){
consigna = -1;
}
MuestraConsigna();
}
//Pulsador PROG
val_pin = digitalRead(ProgPin);
if (val_pin == LOW){
//Cambiamos modo de programacion
}
}
else{
if (m_auto == 0){
// Pulsador DOWN
val_pin = digitalRead(DwPin);
if (val_pin == LOW){
setCompresor(1);
}
else{
setCompresor(0);
}
}
}
}
void LeeSensorPresion(){
val_sensor = analogRead(SensorPin);
//Calculamos presion
vol_sensor = map(val_sensor,0,1023,0,5000);
presion = ((vol_sensor - 2500.0) / 2000.0) * (-1) ;
delay(110);
}
void CalculaSalida(){
if(m_auto == 1 && m_stop == 0){
delta = abs(1) * ((float)histeresis/1000);
if (presion > (consigna + delta)){
setCompresor(1);
}
if( presion < (consigna - delta)){
setCompresor(0);
}
}
}
void MuestraDatosSonda() {
//Sensor
lcd.print("P ",0,0);
if (presion < 0){
lcd.print(dtostrf(presion,2,3,buffer),0,1);
}
else{
lcd.print(dtostrf(presion,2,3,buffer),0,2);
}
delay(20);
MuestraConsigna();
MuestraHisteresis();
//Estado
MuestraEstado();
MuestraActuador();
}
void MuestraConsigna(){
//Consigna
lcd.print("C ",1,0);
if (consigna < 0){
lcd.print(dtostrf(consigna,2,3,buffer),1,1);
}
else{
lcd.print(dtostrf(consigna,2,3,buffer),1,2);
}
delay(20);
}
void MuestraHisteresis(){
//Histeresis
lcd.print("H",1,12);
if(histeresis < 10){
str = " ";
str.append(histeresis);
str.append("%");
}
else{
str = "";
str.append(histeresis);
str.append("%");
}
lcd.print(str.getChars(),1,13);
delay(20);
}
void MuestraActuador(){
if(compresor == 0){
lcd.print("OFF",0,13);
}
else{
lcd.print(" ON",0,13);
}
delay(20);
}
void MuestraEstado(){
if(m_stop == 1){
lcd.print("STOP",0,8);
}
else{
if (m_auto == 1){
lcd.print("AUTO",0,8);
}
else{
lcd.print("MANU",0,8);
}
}
delay(20);
}
void setCompresor(byte estado){
if(estado == 1 && m_stop == 0){
compresor = 1;
digitalWrite(CompresorPin,HIGH);
}
else{
compresor = 0;
digitalWrite(CompresorPin,LOW);
}
delay(10);
MuestraActuador();
}
Hola Lytium, debes ser paciente.
El tema es que muchos ven esto como que es un hobby y luego se dan cuenta como bien dices que aprenderlo lleva tiempo.
- LCD 16x2 Keypad shield
- BMP 180
- Rele AVR DSP ARM 10A
Con estos elementos no entiendo para que usar la librería MiLCD, ya tienes una librería que hace lo mismo.
Bueno, no tiene importancia.
El BMP180 es un sensor i2C asi que no sirve nada de lo que tienes en el código presentado pero se puede adaptar.