Se sei già registrato           oppure    

Orario: 02/05/2024 15:36:03  

 

Energia Alternativa ed Energia Fai Da Te > Arduino


Relè sequenziali
FinePagina

RAUNARDE
GigaWatt


Gruppo:Utente
Messaggi:1225

Stato:



Inviato il: 20/02/2018 14:54:51

Ciao a tutti, avrei bisogno di un'informazione o meglio un aiuto.

premessa : ho impiegato 2 giorni per riuscire a far funzionare il mio lcd con I2C, non andava mai, poi ho trovato, dopo aver usato il tool I2c scanner per verificare l'indirizzo, una serie di istruzioni corretta che mi fa funzionare il display a 20colonne e 4 righe di origine cinese, come l'I2c.


ora riesco a far girare il mio primo programma, ma ho 2 problemi:
1) dopo ogni incremento del valore buttonPushCounter, avrei bisogno che tutti i relè tornassero con lo stato HIGH, quindi un digitalWrite (relè n =HIGH);
invece ora mi fa un cambio stato in pratica simultaneo tra es relè2 e 3, invece vorrei una pausa di 500ms
2) a display la prima routine funziona bene, i caratteri sono fissi, mentre nelle altre istanze, c'è uno sfarfallio dei caratteri nella 3 e 4 riga.

vi allego il codice in modo da verificare.
Premetto che sarà pieno di banalità che si potevano escludere ma essendo il mio primo tentativo, ho preso qua e là varie info e le ho adattate al mio scopo.

#include <Wire.h> 
// include the library code:
#include <LiquidCrystal_I2C.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  
  
void mot_on1();
void mot_on2();
void mot_on3();
void mot_on4();
void mot_off();

const int button = 22;
const int rele1=23;
const int rele2=24;
const int rele3=25;
const int rele4=26;
const int rele5=27;
const int rele6=28;
const int rele7=29;
const int rele8=30;
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

void setup() {
  
  // Print a message to the LCD.
  
  lcd.begin (20,4);
 
   lcd.setCursor(3,0); //Start at character 4 on line 0
  lcd.print("abracadabra");
  delay (1000);
  lcd.setCursor(0,1);
  lcd.print("prova relè");
  delay (1000);  
  lcd.setCursor(0,2);
  lcd.print("Selezionare relè");
  lcd.setCursor(13,3);
  lcd.print("By Raul");
  delay(2000);
  lcd.clear();
  pinMode(button, INPUT);
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(rele6, OUTPUT);
  pinMode(rele7, OUTPUT);
  pinMode(rele8, OUTPUT);
  digitalWrite (rele1, HIGH);
  digitalWrite (rele2, HIGH);
  digitalWrite (rele3, HIGH);
  digitalWrite (rele4, HIGH);
  digitalWrite (rele5, HIGH);
  digitalWrite (rele6, HIGH);
  digitalWrite (rele7, HIGH);
  digitalWrite (rele8, HIGH);
 
  
}

void loop() {
  
 
 
  lcd.setCursor(5,0);
  lcd.print("pinco pallino ");
  lcd.setCursor(1,2);
  lcd.print("Selezionare relè");
 
  buttonState = digitalRead(button);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
      }
  }


  if (buttonPushCounter == 1){
  mot_on1();
  }

  if (buttonPushCounter == 2){
  mot_on2();
  }
  if (buttonPushCounter == 3){
  mot_on3();
  }
  if (buttonPushCounter == 4){
  mot_on4();
  }
  if (buttonPushCounter == 5){
  mot_off();
  }
  lastButtonState = buttonState;
}

void mot_on1() {
  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("test relè 1");
  lcd.setCursor(0,2);
  lcd.print("relè 1 e 5");
  delay (500);
  
  digitalWrite (rele1, LOW);
  digitalWrite (rele2, HIGH);
  digitalWrite (rele3, HIGH);
  digitalWrite (rele4, HIGH);
  digitalWrite (rele5, LOW);
  digitalWrite (rele6, HIGH);
  digitalWrite (rele7, HIGH);
  digitalWrite (rele8, HIGH);
 
}

void mot_on2() {
  
  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("test relè 2");
  lcd.setCursor(0,2);
  lcd.print("relè 2 e 6");
  delay (500);
  digitalWrite (rele1, HIGH);
  digitalWrite (rele2, LOW);
  digitalWrite (rele3, HIGH);
  digitalWrite (rele4, HIGH);
  digitalWrite (rele5, HIGH);
  digitalWrite (rele6, LOW);
  digitalWrite (rele7, HIGH);
  digitalWrite (rele8, HIGH);
  
 
}

void mot_on3() {
  
  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("test relè 3");
  lcd.setCursor(0,2);
  lcd.print("relè 3 e 7");
  delay (500);
  digitalWrite (rele1, HIGH);
  digitalWrite (rele2, HIGH);
  digitalWrite (rele3, LOW);
  digitalWrite (rele4, HIGH);
  digitalWrite (rele5, HIGH);
  digitalWrite (rele6, HIGH);
  digitalWrite (rele7, LOW);
  digitalWrite (rele8, HIGH);

 
  
}

void mot_on4() {
  
  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("test relè 4");
  lcd.setCursor(0,2);
  lcd.print("relè 4 e 8");
  delay (500);
  digitalWrite (rele1, HIGH);
  digitalWrite (rele2, HIGH);
  digitalWrite (rele3, HIGH);
  digitalWrite (rele4, LOW);
  digitalWrite (rele5, HIGH);
  digitalWrite (rele6, HIGH);
  digitalWrite (rele7, HIGH);
  digitalWrite (rele8, LOW);

  
  
}

void mot_off() {
  buttonPushCounter = 0;
  lcd.clear();
  
  
  digitalWrite (rele1, HIGH);
  digitalWrite (rele2, HIGH);
  digitalWrite (rele3, HIGH);
  digitalWrite (rele4, HIGH);
  digitalWrite (rele5, HIGH);
  digitalWrite (rele6, HIGH);
  digitalWrite (rele7, HIGH);
  digitalWrite (rele8, HIGH);
  delay (2500);

  
       
}




 

RAUNARDE
GigaWatt


Gruppo:Utente
Messaggi:1225

Stato:



Inviato il: 21/02/2018 12:29:36

eccomi con ulteriori sviluppi.
ho inserito un secondo pulsante che mi fa decrementare la sequenza dei relè eccitati.
ora mi trovo comunque al punto dove vorrei da un passaggio all'altro sequenziale che tutti i relè passassero per 300/500ms allo stato HIGH che con le mie schedine di relè corrisponde a rele non eccitato.
per non ripetere sempre il blocco di digitalWright rele1/2/3/4/5/6/7/8 cosa posso usare, tra l'altro non riesco a farlo funzionare perchè inserendolo nello stesso void mi eccita e diseccita i 2 relè selezionati ogni ciclo di loop con la pausa data dal delay? stavo guardando l'array, ma non so come usarlo per mettere tutti e 8 i relè nell'indice.

il problema del display che sfarfalla c'è sempre ed ho capito che è legato al tempo che impiega la funzione a eseguire il loop, se aumento il delay a 10000 vedo che in pratica mi riscrive la schermata ogni 10 secondi. come posso escludere questa funzione dal loop, mi serve che il print.screen sia fisso dopo ogni cambio relè, in pratica riscrive lo schermo e poi resta fisso fino al prossimo comando con pulsante up e down

 
 InizioPagina
 

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum