-
Administrador
Mensajes: 2657 Registrado: 05 Feb 2009, 13:16 Ubicación: Almuñécar - La Herradura
|
Publicado: 23 Abr 2009, 20:58
Por si queréis ir bicheando os pongo el código del controlador. En mi caso estoy usando un LCD con un interface serie, para utilizar únicamente un pin digital para mostrar la información. La he pedido en BricoGeek, junto con el arduino y una placa de prototipos. En menos de 24 horas tenía el pedido en casa. Pantalla: http://www.bricogeek.com/shop/87-pantal ... negro.htmlArduino: http://www.bricogeek.com/shop/10-arduin ... e-usb.htmlPlaca de prototipos: http://www.bricogeek.com/shop/132-ardui ... o-pcb.htmlEsta es la versión preliminar del controlador: NOTA IMPORTANTE: El controlador todavía no está totalmente testeado. Lo he publicado con fines educativos. No me hago responsable si lo usáis directamente para hacer alas al vacío y al final os quedan como un churro.- Código: Seleccionar todo
#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(); }
Como podéis comprobar necesitareis dos bibliotecas: WString: http://arduino.cc/en/uploads/Tutorial/String.zipMiSLCD: Es una variación personal de la biblioteca SerLCD de sparkfun, mas que nada para personalizar los mensajes de bienvenida. No obstante podéis usar directamente la original. http://www.sparkfun.com/datasheets/LCD/SerLCD-v2.zipCuando tenga otro ratico os pongo el manual de uso.
Rubén Castro Club Aeromodelismo Granada
|