Salve a tutti!
Mi presento...
Sono un nuovo iscritto del forum, nonché un novizio anche in tema Arduino.
Che però, sotto consiglio di un amico, ed il recente avvicinarmi al mondo dell'automazione, ho deciso di provare a realizzare un piccolo progettino per il monitoraggio del livello dell'acqua nel mio autoclave.
Vi illustro brevemente il funzionamento.
Il progetto si compone di 4 stadi:
- Logica: per la logica ho utilizzato un Arduino UNO al quale ho connesso una scheda da 8 relè. Ho integrato anche una porta USB-B da pannello per flashare eventuali modifiche al SW e un altro interruttore a chiave per effettuare il reset.
- Output: per visualizzare lo stato del sistema ho connesso 1 display LCD il quale mostra prima una sorta di boot, poi il nome del sistema e infine lo stato. Una lampadina per indicare che Arduino è acceso. E una torretta di segnalazione verde/rossa per indicare lo stato del sistema.
- Input: per prelevare i dati ho utilizzato un banale sensore ad ultrasuoni che tramite una serie di calcoli ripartisce le misure in livelli e stati.
La macchina è suddivisa in 2 unità:
- 1 Unita: alimentazione, logica, output
- 2 Unità: input
Dopo aver testato il sistema per diverse settimane ho voluto acquistare una Ethernet Shield per espandere le sue potenzialità. Ciò che mi interessava fare era quello di creare una sorta di Web Server locale in HTML dove andare a visualizzare semplicemente gli stati della macchina. Così dopo aver provato assieme al mio amico il funzionamento di base della Shield l'abbiamo integrata. Una volta passati i cavi e richiuso il pannello andiamo per flashare il nuovo SW da noi modificato sulla base dei tanti web server e con nostra spiacevole sorpresa niente andava come doveva.
Questo è il codice dopo l'aggiunta della Shield:
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal.h>
const int Trig = 13, Echo = 12, Green = 8, Max = 7, Min = 6;
const int rs = 0, en = 1, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
const int minimo = 90, massimo = 50;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
byte avvio[8] = {
B11111,
B00000,
B11111,
B11111,
B11111,
B11111,
B00000,
B11111
};
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 178, 49);
EthernetServer server(80);
void setup() {
Ethernet.begin(mac, ip);
server.begin();
lcd.createChar(1, avvio);
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
pinMode(Min,OUTPUT);
pinMode(Max,OUTPUT);
pinMode(Green,OUTPUT);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(" CMV SISTEMI ");
delay(1000);
for(int i=-1;i<15;i++) {
lcd.setCursor(i+1,1);
lcd.write(1);
delay(500);
}
delay(1000);
lcd.clear();
delay(250);
lcd.setCursor(0,0);
lcd.print(" MONITORAGGIO ");
delay(200);
lcd.setCursor(0,1);
lcd.print(" RISERVA IDRICA ");
delay(4000);
lcd.clear();
}
void loop() {
//Rele Segnalazione 5V
digitalWrite(Green,LOW);
//Avvio Server
EthernetClient client = server.available();
if (client) {
boolean blank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if ((c == '\n') && blank){
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<H1>PROVA</H1>");
client.println("</html>");
break;
}
if (c == '\n') {
blank = true;
} else if (c != '\r') {
blank = false;
}
}
}
delay(1);
client.stop();
Ethernet.maintain();
}
//Attivazione Sensore
digitalWrite(Trig, LOW);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
//Calcolo distanza e livello
long durata = pulseIn(Echo, HIGH);
long distanza = durata/58.31;
int livello = 100 - (((distanza-15)*100)/110) ; // (distanza-15) : livello = 110 : 100
delay(500);
String liv = (String)livello;
while(livello > 100){
lcd.setCursor(0,0);
lcd.print(" ANOMALIA ");
delay(250);
lcd.setCursor(0,1);
lcd.print(" Livello: " + liv + "%");
delay(100);
digitalWrite(Min,LOW);
delay(500);
digitalWrite(Max,LOW);
delay(100);
digitalWrite(Green,LOW);
digitalWrite(Trig, LOW);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
durata = pulseIn(Echo, HIGH);
distanza = durata/58.31;
livello = 100 - (((distanza-15)*100)/110) ; // (distanza-15) : livello = 110 : 100
liv = (String)livello;
}
//Aggiornamento Display con Stato Autoclave
if(distanza > minimo) {
lcd.setCursor(0,0);
lcd.print("AUTOCLAVE: VUOTO ");
delay(250);
lcd.setCursor(0,1);
lcd.print(" Livello: " + liv + "%");
delay(100);
digitalWrite(Min,LOW);
delay(500);
digitalWrite(Max,HIGH);
}
else{
if(distanza < massimo) {
lcd.setCursor(0,0);
lcd.print("AUTOCLAVE: PIENO ");
delay(250);
lcd.setCursor(0,1);
lcd.print(" Livello: " + liv + "%");
delay(100);
digitalWrite(Min,HIGH);
delay(500);
digitalWrite(Max,LOW);
}
else {
lcd.setCursor(0,0);
lcd.print("AUTOCLAVE: MEDIO ");
delay(250);
lcd.setCursor(0,1);
lcd.print(" Livello: " + liv + "%");
delay(100);
digitalWrite(Min,LOW);
delay(500);
digitalWrite(Max,HIGH);
}
}
}
Abbiamo provato e riprovato ma ogni volta o il programma si blocca in anomalia, o il display non stampa niente, ma sopratutto sulla Shield si accendono tutte le luci tranne quella di TX ed L (non link quella va) e quindi non si connette.
Tengo molto a questo progetto, visto che ci ho speso anche qualche soldino. Il mio amico dice che forse per il mio scopo era meglio un PLC
, io invece sperò che voi possiate aiutarmi.