Ciao a tutti,
incuriosito da alcuni post inseriti, ho deciso di cimentarmi con Arduino per creare una livella elettronica da utilizzare quando parcheggio il camper.
In sostanza utilizzo il monitor della radio (ho diversi ingressi video) per presentare a video le inclinazioni del mezzo.
Visto che Arduino ha molteplici ingressi/uscite, ho aggiunto anche le funzioni per accendere una luce in prossimità dello scarico acque nere (ho già la telecamere ma quando è buio non vedo nulla e devo comunque scendere), comandare la valvola di scarico (devo ancora instalarla), monitorare le tensioni delle batterie e visualizzare le temperature interne ed esterne con la relativa umidità.
Sono ancora in fase di test a banco... sto solo aspettando il sensore di inclinazione per completare il progettino e poi passerò all'installazione sul camper.
Vi posto alcune immagini del monitor:

Visto che sul sito ci sono utenti mooolto più esperti di me, posto lo sketch che ho realizzato, piacerebbe avere consigli e suggerimenti per migliorare il progetto...
#include <TVout.h>
#include <fontALL.h>
#include <DHT.h>
#include <I2Cdev.h>
#include <MPU6050.h>
//include <Wire.h>
#define DHTPINI 10 //Sonda Interna
#define DHTPINE 8 // Sonda Esterna
#define DHTTYPE DHT11
#define BUTTONLUCE 2
#define BUTTONVALVOLA 3
#define BM A4
#define BS A5
#define RelayLuceScarico 4
#define RelayValvolaScarico 5
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int ButtonLuceScarico = 0;
int StatoLuceScarico = 0;
int ButtonValvolaScarico = 0;
int StatoValvolaScarico = 0;
TVout TV;
DHT dhti(DHTPINI, DHTTYPE);
DHT dhte(DHTPINE, DHTTYPE);
void setup() {
dhti.begin();
dhti.begin();
//Wire.begin();
pinMode(BUTTONLUCE, INPUT);
pinMode(BUTTONVALVOLA, INPUT);
pinMode(RelayLuceScarico, OUTPUT);
pinMode(RelayValvolaScarico, OUTPUT);
TV.begin(PAL, 120, 96);
TV.select_font(font6x8);
TV.print(10, 30, "Welcome to Pegaso");
TV.print(47, 40, "off");
TV.print(18, 50, "Gelati Family");
TV.delay(4000);
TV.clear_screen();
// accelgyro.initialize();
// TV.print(2, 60, "Testing MPU6050..");
// TV.print(2, 70, (accelgyro.testConnection() ? "MPU6050 OK" : "MPU6050 Failed"));
}
void loop() {
inizio:
//accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
int ti = dhti.readTemperature();
float hi = dhti.readHumidity();
int te = dhte.readTemperature();
float he = dhte.readHumidity();
TV.draw_line(0, 0, 120, 0, 1);
TV.draw_line(0, 0, 0, 25, 1);
TV.draw_line(119, 0, 119, 25, 1);
TV.draw_line(0, 25, 120, 25, 1);
TV.print(2, 5, "T.Cellula:");
TV.print(60, 5, ti);
TV.print(72, 5, "c");
TV.print(80, 5, hi);
TV.print(112, 5, "%");
TV.print(2, 15, "T.Esterna:");
TV.print(60, 15, te);
TV.print(72, 15, "c");
TV.print(80, 15, he);
TV.print(112, 15, "%");
TV.draw_line(0, 30, 120, 30, 1);
TV.draw_line(0, 30, 0, 45, 1);
TV.draw_line(119, 30, 119, 45, 1);
TV.draw_line(0, 45, 120, 45, 1);
int bm = analogRead(BM);
float vbm = bm * (5.0 / 1023.0);
TV.print(2, 35, "BM:");
TV.print(25, 35, vbm);
TV.print(50, 35, "V");
int bs = analogRead(BS);
float vbs = bs * (5.0 / 1023.0);
TV.print(60, 35, "BS:");
TV.print(85, 35, vbs);
TV.print(110, 35, "V");
StatoLuceScarico = digitalRead(RelayLuceScarico);
StatoValvolaScarico = digitalRead(RelayValvolaScarico);
if (StatoLuceScarico == HIGH) {
TV.print(2, 50, "Luce Scarico: [ ON]");
}
else {
TV.print(2, 50, "Luce Scarico: [OFF]");
}
if (StatoValvolaScarico == HIGH) {
TV.print(2, 60, "Valv Scarico: [ ON]");
}
else {
TV.print(2, 60, "Valv Scarico: [OFF]");
}
ButtonLuceScarico = digitalRead(BUTTONLUCE);
ButtonValvolaScarico = digitalRead(BUTTONVALVOLA);
if (ButtonLuceScarico == HIGH && ButtonValvolaScarico == LOW ) {
goto LuceScarico;
}
else if (ButtonValvolaScarico == HIGH && ButtonLuceScarico == LOW ) {
goto ValvolaScarico;
}
else if (ButtonValvolaScarico == HIGH && ButtonLuceScarico == HIGH ) {
goto Bolla;
}
else {
goto inizio;
}
LuceScarico:
StatoLuceScarico = digitalRead(RelayLuceScarico);
if (StatoLuceScarico == HIGH) {
digitalWrite(RelayLuceScarico, LOW);
delay(1500);
goto inizio;
}
else {
digitalWrite(RelayLuceScarico, HIGH);
delay(1500);
goto inizio;
}
ValvolaScarico:
StatoValvolaScarico = digitalRead(RelayValvolaScarico);
if (StatoValvolaScarico == HIGH) {
digitalWrite(RelayValvolaScarico, LOW);
delay(1500);
goto inizio;
}
else {
digitalWrite(RelayValvolaScarico, HIGH);
delay(1500);
goto inizio;
}
Bolla:
//TV.print(2, 70, ("a/g:\t"));
//TV.print(20, 80, (ax));
//TV.print(40, 80, (ay));
//TV.print(60, 80, (az));
//TV.print(20, 90, (gx));
//TV.print(40, 90, (gy));
//TV.print(60, 90, (gz));
TV.clear_screen();
TV.print(2, 10, "Level");
TV.print(2, 20, "Park");
//TV.print(2, 30, "");
TV.draw_line(81, 9, 113, 9, 1); //riga in alto
TV.draw_line(81, 91, 113, 91, 1); // riga in basso
TV.draw_line(80, 10, 80, 90, 1); // colonna sx
TV.draw_line(113, 10, 113, 90, 1); // colonna dx
TV.draw_line(79, 20, 79, 30, 1); //ruota ant. sx
TV.draw_line(114, 20, 114, 30, 1); //ruota ant. sx
TV.draw_line(79, 75, 79, 85, 1); //ruota post.sx
TV.draw_line(114, 75, 114, 85, 1); //ruota post. dx
delay(40000);
TV.clear_screen();
goto inizio;
}
Marco
Modificato da gelax il 26/04/2014 alle 13:51:06