Interferenze display con pompa 5volt

ciao a tutti, sto provando a realizzare un classico progetto di arduino: autoiirrigazione con arduino.
Componenti:
Arduino uno rev 3
Display LCD 1602
Igrometro
foto-sensore
Relè
Pompetta 5 volt

Il funzionalmento è banale: quando il foto sensore rileva il buio, il codice controlla l’umidità del terreno tramite l’igrometro e quando questa è al di sotto di una certa soglia, il relè si attiva facendo partire una pompetta da 5 volt.

Il mio unico problema è che al momento in cui il relè si attiva e la pompa parte, sul display appaiono dei caratteri strani e mi si sfasano le scritte sul display stesso senza più ritornare apposto quando la pompa si spegne…Ho letto vari argomenti in merito ed in alcuni di questi consigliano di usare uno snubber in parallelo…Comprato, messo ma il problema rimane…Potete aiutarmi a capire dove è il problema?
di seguito lo schema dei collegamenti e il codice

#include <LiquidCrystal.h>

#define photoSensor 8
#define hygrometer A0
#define relay 13
#define lcdContrast 6
#define lcdRs 12
#define lcdEn 11
#define lcdD4 5
#define lcdD5 4
#define lcdD6 3
#define lcdD7 2

const int MinHumidityThreshold = 20;
const int MaxHumidityThreshold = 50;
const int contrast = 75;

const String light = "Light: ";
const String hum = "Humidity: ";
const String night = "night";
const String day = "day";

LiquidCrystal lcd(lcdRs, lcdEn, lcdD4, lcdD5, lcdD6, lcdD7);

int lightness = 0;
int humidity = 0;
int relayState = 1;
int Li = 16;
int Lii = 0;

void setup() {
  analogWrite(lcdContrast,contrast);
  prepareLcd();  
  pinMode(hygrometer, INPUT);
  pinMode(photoSensor, INPUT);
  pinMode(relay, OUTPUT);
}

void loop() {
  lightness = digitalRead(photoSensor);
  logDisplay();
  
  if(lightness == HIGH){
    humidity = map(analogRead(hygrometer), 0, 1023, 100, 0);
    if(humidity <= MinHumidityThreshold && relayState == 1){
      digitalWrite(relay, LOW);
      relayState = 0;
    }
    else if(humidity >= MaxHumidityThreshold){
      digitalWrite(relay, HIGH);
      relayState = 1;
    }
  }
  else{
    relayState = 1;
    digitalWrite(relay, HIGH);
  }
  delay(250);
}

void logDisplay(){
  clearLcdLine(0);
  clearLcdLine(1);
  lcd.setCursor(0, 0);
  String dayLight = lightness == HIGH ? night : day;
  lcd.print(light + dayLight);
  if(lightness == HIGH){
    lcd.setCursor(0, 1);
    if(relayState == 0){
      lcd.print(scrollLeft("Watering plant..."));
    }
    else{
      Li = 16;
      Lii = 0;
      lcd.print(hum + humidity + "%");
    }
  }
  else{
    clearLcdLine(1);
    Li = 16;
    Lii = 0;
    lcd.print("Waiting night");
  }
}

String scrollLeft(String stringDisplay){
  String result;
  String strProcess = stringDisplay + "                " + stringDisplay;
  result = strProcess.substring(Li, Lii);
  Li++;
  Lii++;
  if(Li > strProcess.length()){
    Li = 16;
    Lii = 0;
  }
  return result;
}

void clearLcdLine(int line){
  for(int n = 0; n < 16; n++) { 
    lcd.setCursor(n,line); 
    lcd.print(" "); 
    } 
    lcd.setCursor(0,line); 
}

void prepareLcd(){
  lcd.begin(16, 2);
  lcd.blink();
  lcd.setCursor(0, 0);
  lcd.print(light);
  lcd.setCursor(0, 1);
  lcd.print(hum);
}

Grazie…!!

Non so se lo snubber è collegato bene (vedi schema)…
Lo snbber che ho comprato è come questo in foto:
snubber

Il modulo relé che stai usando è dotato di ingresso con fotoaccoppiatore? Se si ti conviene separare le due alimentazioni totalmente (quindi neppure il GND in comune) usando due distinti alimentatori, uno per la logica ed uno per la pompa. Magari tanto per provare a vedere se così risolvi

Ok grazie intanto per la risposta. Provo a separare le alimentazioni
…che tipo di batteria posso usare per la pompa? Ne esistono di ricaricabili per pompe a 5 volt?

Lo snubber va o ai capi della pompa o ai capi dei contatti relé. Essendo la pompa in corrente continua basterebbe un diodo ai suoi capi con il catodo verso il positivo. Inoltre l’avvio della pompa potrebbe abbassare per un attimo la tensione (dipende dai collegamenti fisici realizzati) mandando in tilt il resto della logica.

Intanto collegare il display come hai fatto tu funziona bene SOLO NELLA TEORIA. In pratica succede quello che tu stai sperimentando perché le connessioni sono tante, magari provvisorie, e lunghe (sono SEMPRE troppo lunghe…)
Per questo motivo ti consiglio, la prossima volta, di comprare gli stessi LCD però con l’interfaccia I2C già saldata sul retro tipo QUESTO con i vantaggi di utilizzare solo DUE PIN di arduino e di avere meno problemi di disturbi sullo schermo.
Anche il display che stai usando può essere modificato saldandogli dietro l’interfaccia I2C

Per risolvere il tuo disturbo dovresti provare la MODIFICA che ho trovato oggi e che ti consiglio: se funziona anche sul tuo fammelo sapere.

1 Like

Grazie Claudio per la risposta… è che non trovo da nessuna parte un’immagine che faccia vedere chiaramente i collegamenti tra snubber e pompa o tra snubber e relè… :frowning:

Grazie Steve…provo a guardarci con calma domani…ho dato una letta ma non mi è chiaro come collegare tutto…

Scusate ma come collego la pompa ad un altra batteria? Vorrei qualcosa di ricaricabile se possibile...mi aiutate a capire cosa prendere?

Ti consiglierei, per adesso, di semplificare tutto: cioè risolvi il problema dei caratteri strani.
Quindi lascia il tuo progetto così com'è e metti i due condensatori da 0,1 su

  • VSS e RW
  • VSS e D0
    e vediamo se risolvi.

Ok li devo ordinare e provo a montarli...

Questi vanno bene?

Normali condensatori ceramici come QUESTI

Io ho questi...vanno bene?

Se vanno bene
..riesci a mostrami come vanno collegati? Non mi è molto chiaro dal post che mi hai girato...nel senso come fanno i piedini del condensatore ad arrivare da casa a D0 o RW ad esempio? Sono molto distanti tra loro...uso dei jumper?...scusami :frowning:

Non mi sembra che i piedini siano così distanti... Io ho addirittura accorciato i piedini dei condensatori
LCD 1602.
Comunque i condensatori puoi provare a metterli alla partenza dei fili, magari sulla breadboard, anche se attaccati allo LCD sicuramente funzionano meglio.

Poi cosa c'è di poco chiaro?

  • il primo condensatore lo metti tra VSS e l'altro polo lo metti su RW
  • il secondo condensatore lo metti ancora su VSS e l'altro polo su D0

Ok provo stasera. Ma vanno bene i condensatori 104 che ti ho messo come foto prima?

Si vanno bene. I condensatori indicati con 104 corrrispondono a 0.1uf.

Steve ho provato con i collegamenti che mi hai detto tu ma niente...continuo a vedere simboli strani quando il relè attiva la pompetta...tra l'altro un dubbio mentre montavo i condensatori...il PIN D0 del display non ha nessun collegamento nel mio circuito...avete qualche altra idea per favore? Ho provato anche a mettere un condensatore ai capi del relè, della pompa e sul display ma nulla...



Come già suggerito anche da @steve-cr compra un adattatore per avere la comunicazione via I2C con il display (o se preferisci compra un display già dotato di adattatore) perché con tutti quei collegamenti le probabilità di interferenze crescono a dismisura e, se non l'hai già fatto (dalle foto non si capisce), separa le alimentazioni usando due alimentatori e non mettere in comune neppure il GND e vedi come va

Ok ho già ordinato un display con i2c... arriverà più avanti...per l'alimentazione separata ci sta, mi torna...ma chiedevo come posso alimentare la pompa tramite delle batterie ricaricabili? Cosa mi serve? Che tipo di batterie e che attacchi devo fare? Se mi date una mano compro tutto e monto...la pompa è a 5 volt.

Hai già posto il quesito della batteria, io non so darti indicazioni precise, e anche altri non hanno fornito nulla quindi mi sa che devi aspettare qualcuno che sappia risponderti. Ma finché sei sul banco usare un alimentatore qualsiasi a 5V non credo sia un problema e ti darebbe indicazione precisa se il problema è quello o altro.