Salve tutti, colgo occasione di augurare Buona Pasqua.
Mi chiamo Lorenzo, sono alle prime esperienze di programmazione con arduino quindi abbiate pazienza, questo è il mio secondo proggetto e vi spiego cosa vorrei fare.
Vorrei realizzare un misuratore di livello carburante per il serbatoio della barca; però invece di utilizzare il solito galleggiante con resistenza variabile annessa io vorrei usare due sensori di pressione.
Il primo sensore legge la pressione idrostatica del carburante ed il secondo legge la pressione dentro il serbatoio il cui valore sarà sattratto al valore di pressione letto dal primo sensore e determinare così il livello finale del carburante.
Lo sketch che ho generato, che per il momento utilizza due potenziometri, sembra funzionare correttamente sul simulatore Proteus 8.9.
Quello che nn riesco ad associare è far lampeggiare un led al raggiungimento della riserva ma solo a farlo accendere impostato sul pin12. Usare il semplice digitalWrite HIGH e poi Low non risolve perché occorre attendere il termine del calcolo della media nel loop e questo impiega un certo tempo abbastanza lungo e il led lampeggia solo al temine del calcolo della media per un solo lampeggio e cio si ripete ad ogni ciclo
mentre a me serve che il led lampeggi sempre quando il carburante entra in riserva anche al ripetersi del loop successivo.
Ciò che va tenuto presente è che
Ho cercato e letto vari esempi di lampeggio del led tipo questo:
/* Blink without Delay
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/
const int ledPin = 13; // the number of the LED pin
int ledState = LOW; // ledState used to set the LED
long previousMillis = 0; // will store last time LED was updated
long interval = 1000; // interval at which to blink (milliseconds)
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
}
però non riesco ad associarlo alla condizione "if "che a me interessa visibile nel secondo sketch:
//questo vuole essere un tentativo di determinre il livello del carburante
//nel serbatoio della barca utilizzando due sensori di pressione da 30psi pari a 2bar
// descrizione il sensore Pr1 misura la pressione che esercita il liquido,
// il sensore P2 invece misura la pressione all'interno del serbatoio e sarà il riferimento.
// l'idea è di misurare la pressione del liquido ogni 15 sec e fornire una media delle letture
// ogni 5 min.
int Pr1 = (A0); // sensore pressione 1
int Pr2 = (A1); // sensore pressione 2
int Array[20]; // carica valori nell array
int T_campionamento = 500; // verificato il funzionamento pertare al valore 15000
int somma; // somma valori dell'array
float media; // calcola la media dei valori memorizzati nell'array
void setup(){
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT); // attiverà led riserva carburante, potrei usare un timer con ne555
}
void loop(){
for (int i=0; i<20; i++){
Array[i] = analogRead(A0) - analogRead(A1);
Serial.print("Array[i] ");
Serial.println( Array[i]);
delay(T_campionamento); //
}
somma = 0; // il primo valore sia zero altrimenti sballa tutto il calcolo
// finito di acquisire, fai la somma di tutti i campioni
for(int i=0; i<20; i++) {
somma = somma + Array[i];
Serial.print("somma ");
Serial.println( somma);
}
//ottenuta la somma puoi fare la media
media = somma / 20;
Serial.print("media= ");
Serial.println( media); // Stampa il valore medio
//il loop finisce e di seguito ricomincia
//per questo è mecessario azzerare di volta in volta la variabile somma
somma =0;
if ( media > 0 && media <= 102 )
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
}
// accensione della barra led
else if ( media > 102 && media <= 203 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
}
// accensione della barra led
else if ( media > 204 && media <= 305 ) // al verificarsi di questa condizione la variabile "media"
// minore del valore 305 il led deve lampeggiare
//continuamente
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
}
// accensione della barra led
else if ( media > 306 && media <= 407 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
// accensione della barra led
else if ( media > 408 && media <= 509 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
// accensione della barra led
else if ( media > 510 && media <= 611 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
// accensione della barra led
else if ( media > 612 && media <= 713 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
// accensione della barra led
else if ( media > 714 && media <= 815 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
// accensione della barra led
else if ( media > 816 && media <= 919 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
// accensione della barra led
else if ( media > 920 && media <= 1023 )
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
}
Serial.println("nuova sequenza");
}
allego uno screenshoot del test con simulatore,
Grazie a tutti, e Buona Pasqua.