- Mié, 22 Mar 2017 21:34
#1367415
Taranis X9D Plus SE 2019
https://ales254.wordpress.com/
https://pilonracer.wordpress.com/
http://rcvortices.blogspot.com.es/
F5J-FAI Milvus HM
Stinger
Stiletto
Daidalos 1.2
Pandion 2,54
-Club Aeromodelisme Tarrega
-Club arc Santa Agnes
Pongo codigo que esta de prueba, funciona en automatico a falta de probar mas funciones .
Este código lo podéis ir probando y/o modificando a gusto de cada cual
dejo también vídeo de la primera prueba
https://youtu.be/QGjV9KkgQqg
Este código lo podéis ir probando y/o modificando a gusto de cada cual
dejo también vídeo de la primera prueba
https://youtu.be/QGjV9KkgQqg
Código: Seleccionar todo
// version en pruebas de vacuometro V.1.0.2 24/03/2017
// codigo basado en el de rcmodelistas.com
// modificado para Arduino uno con shiel lcdkeypad
// jjboullosa. Miliamperios.com
#include <LiquidCrystal.h>
#include <Wire.h>
#include <SFE_BMP180.h>
#include <LCDKeypad.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int key =0;
int lcd_key = 0;
int adc_key_in = 0;
int cuenta=0;
#define btnAutoPin 1 // orden botones lcdkey
#define btnStopPin 4
#define btnUpPin 3
#define btnDwPin 2
#define btnProgPin 0
#define btnNONE 5
int read_LCD_buttons() // para leer los botones
{ adc_key_in = analogRead(0); // Leemos A0
// Mis botones dan: 0, 145, 329,507,743
// Y ahora los comparamos con un margen comodo
if (adc_key_in > 900) return btnNONE; // Ningun boton pulsado
if (adc_key_in < 50) return btnProgPin;
if (adc_key_in < 144) return btnUpPin;
if (adc_key_in < 329) return btnDwPin;
if (adc_key_in < 504) return btnStopPin;
if (adc_key_in < 741) return btnAutoPin;
return btnNONE; // Por si todo falla
}
int val_sensor = 0;
int val_pin = 0;
float vol_sensor = 0;
float consigna = 0.0;
float delta;
int histeresis = 20;
// Variables de estado
byte compresor =0;
byte m_auto =0;
byte m_stop = 1;
// Salidas
int CompresorPin = 3;
// Analogicas
//int SensorPin = 0;
String str;
char buffer[32];
//Se declara una instancia de la librería
SFE_BMP180 pressure;
//Se declaran las variables. Es necesario tomar en cuenta una presión inicial
//esta será la presión que se tome en cuenta en el cálculo de la diferencia de altura
double PresionBase;
//Leeremos presión y temperatura. Calcularemos la diferencia de altura
double Presion = 0;
double PresionF = 0;
double Altura = 0;
double Temperatura = 0;
char status;
void actualizarPrg() { //swich para cambio de manual a automatico PRG
switch(cuenta){
case 0:
digitalWrite(CompresorPin,LOW);
lcd.setCursor(8,1);
lcd.print(" ");
break;
case 1:
digitalWrite(CompresorPin,HIGH);
lcd.setCursor(8,1);
lcd.print("PRG");
break;
}
}
void setup() {
SensorStart();
Serial.begin(9600);
//Se inicia el sensor y se hace una lectura inicial
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0,0);
//Mostramos version
lcd.print(" VACUO 0.1 ");
lcd.setCursor(0,1);
lcd.print(" Miliamperios");
//Salidas digitales
pinMode(CompresorPin,OUTPUT);
//digitalWrite(CompresorPin,HIGH);
delay(5000);
lcd.clear();
//Se inicia el sensor y se hace una lectura inicial
}
void loop() {
LeeInterruptores();
LeePulsadores();
ReadSensor(); //Se hace lectura del sensor mbp180
LeeSensorPresion();
CalculaSalida();
MuestraDatosSonda();
MuestraConsigna();
MuestraHisteresis();
MuestraActuador();
MuestraEstado();
}
void LeeInterruptores(){
lcd_key=read_LCD_buttons();
if (lcd_key == btnStopPin){
m_stop = 1;
setCompresor(0);
}
if (lcd_key == btnAutoPin){
m_auto = 1;
m_stop=0;
setCompresor(1);
}
MuestraEstado();
}
void LeePulsadores(){
lcd_key = read_LCD_buttons();
if( m_stop == 1 || m_auto == 1){
// Pulsador UP
if (lcd_key == btnUpPin){
//Subimos consigna
consigna += 0.01;
if (consigna > 0){
consigna = 0;
}
MuestraConsigna();
}
// Pulsador DOWN
if (lcd_key == btnDwPin){
//Bajamos consigna
consigna -= 0.01;
if (consigna < -1){
consigna = -1;
}
MuestraConsigna();
}
//Pulsador PROG
if (lcd_key == btnProgPin){
cuenta++;
if (cuenta >= 2) {
cuenta = 0;
}
actualizarPrg();
}
}
}
void LeeSensorPresion(){
status = pressure.startPressure(3);
//Calculamos Presion
PresionF= (Presion/1000)*-1;
delay(110);
}
void CalculaSalida(){
if(m_auto == 1 && m_stop == 0){
delta = abs(1) * ((float)histeresis/1000);
if (PresionF < (consigna - delta)){
setCompresor(1);
}
if( PresionF > (consigna + delta)){
setCompresor(0);
}
}
}
void MuestraDatosSonda() {
//Sensor
lcd.setCursor(0,0);
lcd.print("P");
if (PresionF < 0){
lcd.setCursor(1,0);
lcd.print(dtostrf(PresionF,2,3,buffer));
}
else{
lcd.setCursor(2,0);
lcd.print(dtostrf(PresionF,2,3,buffer));
}
delay(20);
MuestraConsigna();
MuestraHisteresis();
//Estado
MuestraEstado();
MuestraActuador();
}
void MuestraConsigna(){
//Consigna
lcd.setCursor(0,1);
lcd.print("C ");
if (consigna < 0){
lcd.setCursor(1,1);
lcd.print(dtostrf(consigna,2,3,buffer));
}
else{
lcd.setCursor(2,1);
lcd.print(dtostrf(consigna,2,3,buffer));
}
delay(20);
}
void MuestraHisteresis(){
//Histeresis
lcd.setCursor(12,1);
lcd.print("H");
if(histeresis < 10){
str = "";
str+=(histeresis);
str+=("%");
}
else{
str = "";
str+=(histeresis);
str+=("%");
}
lcd.setCursor(13,1);
lcd.print(str) ;
delay(20);
}
void MuestraActuador(){
if(compresor == 0){
lcd.setCursor(13,0);
lcd.print("OFF");
}
else{
lcd.setCursor(13,0);
lcd.print(" ON");
}
delay(20);
}
void MuestraEstado(){
if(m_stop == 1){
lcd.setCursor(8,0);
lcd.print("STOP");
}
else {
if (m_auto == 1){
lcd.setCursor(8,0);
lcd.print("AUTO");
}
else{
lcd.setCursor(8,0);
lcd.print("MANU");
}
}
delay(20);
}
void setCompresor(byte estado){
Serial.print("estado =");
Serial.println(estado);
if(estado == 1 && m_stop == 0){
compresor = 1;
digitalWrite(CompresorPin,HIGH);
}
else{
compresor = 0;
digitalWrite(CompresorPin,LOW);
}
delay(10);
MuestraActuador();
}
void SensorStart() {
//Secuencia de inicio del sensor
if (pressure.begin())
Serial.println("BMP180 init success");
else
{
Serial.println("BMP180 init fail (disconnected?)\n\n");
while (1);
}
//Se inicia la lectura de temperatura
status = pressure.startTemperature();
if (status != 0) {
delay(status);
//Se lee una temperatura inicial
status = pressure.getTemperature(Temperatura);
if (status != 0) {
//Se inicia la lectura de Presiones
status = pressure.startPressure(3);
if (status != 0) {
delay(status);
//Se lee la presión inicial incidente sobre el sensor en la primera ejecución
status = pressure.getPressure(PresionBase, Temperatura);
}
}
}
}
void ReadSensor() {
//En este método se hacen las lecturas de presión y temperatura y se calcula la altura
//Se inicia la lectura de temperatura
status = pressure.startTemperature();
if (status != 0)
{
delay(status);
//Se realiza la lectura de temperatura
status = pressure.getTemperature(Temperatura);
if (status != 0)
{
//Se inicia la lectura de presión
status = pressure.startPressure(3);
if (status != 0)
{
delay(status);
//Se lleva a cabo la lectura de presión,
//considerando la temperatura que afecta el desempeño del sensor
status = pressure.getPressure(Presion, Temperatura);
if (status != 0)
{
//Se hace el cálculo de la altura en base a la presión leída en el Setup
Altura = pressure.altitude(Presion, PresionBase);
}
else Serial.println("error en la lectura de Presion\n");
}
else Serial.println("error iniciando la lectura de Presion\n");
}
else Serial.println("error en la lectura de temperatura\n");
}
else Serial.println("error iniciando la lectura de temperatura\n");
}
Última edición por juan jose boullosa el Vie, 24 Mar 2017 19:13, editado 4 veces en total.
Taranis X9D Plus SE 2019
https://ales254.wordpress.com/
https://pilonracer.wordpress.com/
http://rcvortices.blogspot.com.es/
F5J-FAI Milvus HM
Stinger
Stiletto
Daidalos 1.2
Pandion 2,54
-Club Aeromodelisme Tarrega
-Club arc Santa Agnes