Ciao a tutti...prima di scrivere sul forum sono stato ore ed ore a cercare una soluzione, ma non ne vengo a capo. Probabilmente ne so ancora troppo poco. Il problema è questo : ho sviluppato uno sketch di un pò di righe che mi permette di tenere sotto controllo delle temperature di una cella di lievitazione. In pratica ho un display con uno sketch che crea un menu gestibile con 4 pulsanti. Usando il display 16x2 , mai avuto problemi. Ho solo cambiato il display ed acquistato un 20x4 i2c per risparmiare i pin ed avere più voci a video. Appena cambio la libreria ed avvio il tutto i pulsanti che fanno modificare il menu non funzionano più ed il codice è evidentemente bloccato perchè lo vedo dal debug seriale. Appena includo la libreria del 16x2 non i2c tutto fila liscio. Quale può essere il problema? Specifico che il display i2c visualizza la prima parte di codice eseguito che non richiede i pulsanti.
Vi posto il codice: non ammazzatemi, sto imparando e sto cercando di migliorarmi
... hai dimenticato di mettere il codice
In ogni caso, per evitare problemi, ti rammento che, in conformità al regolamento, punto 7, il codice DEVE essere racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra
Guglielmo
... altra cosa .. hai verificato che il modulo I2C di quel display già disponga dellle resistenze di pull-up? In caso contrario, hai provveduto a metterle tu?
Guglielmo
Grazier per la risposta. Non avevo pubblicato il codice in quanto non potevo postare nei 5 minuti dal primo post e non avevo spazio nell'altro
Il sito del produttore non parla di resistenze di pullup e quindi non le ho messe. Indicano di collegare direttamente.
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#include <Wire.h>
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS A0
/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
/********************************************************************/
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
/********************************************************************/
//********Variabili impostazione temperatura e umidità*********************//
int umidita = 0;
int temperatura = 18;
int a = 20;
int b = 30;
int c = 0;
int d = 0;
int e = 0;
int powerLCD_pin = A5; // pin di alimentazione dell'LCD
//***********************************//
int temperature();
int controllo_orario();
//Counters to change positions of pages and sub-menus
int page_counter = 1 ; //To move beetwen pages
int subpage_counter = 0; //To move submenu 1 RGB
int subpage2_counter = 0; //To move submenu 2 Lievitazione
int subpage3_counter = 0; //per spostarsi al sottomenù StatoCella
//-------Pins-----//
int up = 7; //Up/Yes button
int sel = 9; //Select button
int down = 8; //Down/No button
int ent = 10; //pulsante enter
int verifica_ent = 0;
int led = 11; //Led (pwm output)
int red = 13; //red color
int green = 12; //green color
int blue = 19; //blue color (A5 as output)
int ora_inizio = 0;
int minuti_inizio = 0;
int ora_fine = 0;
int minuti_fine = 0;
int ora_inizio1 = 0;
int minuti_inizio1 = 0;
int ora_fine1 = 0;
int minuti_fine1 = 0;
int conferma_effettuata;
boolean blink_state = false;
unsigned long blink_currentMillis = 0;
uint32_t blink_interval = 500;
uint32_t blink_previousMillis = 0;
//dichiaro due variabili che sono valorizzate per la quantità di pulsanti che utilizzo e relativi pin
const int numOfInputs = 4;
const int inputPins[numOfInputs] = {7, 8, 9, 10};
//---------Storage states of buttons for debounce function-----//
boolean current_up = LOW;
boolean last_up = LOW;
boolean current_sel = LOW;
boolean last_sel = LOW;
boolean last_down = LOW;
boolean current_down = LOW;
boolean current_ent = LOW;
boolean last_ent;
//--------Led states-----------//
boolean red_state = LOW;
boolean green_state = LOW;
boolean blue_state = LOW;
int led_lum = 00;
int aggiornamento_temp = 0;
// definizione del carattere °
byte gradi[8] = {
B01110,
B01010,
B01110,
B00000,
B00000,
B00000,
B00000,
B00000
};
//Custom return char
byte back[8] = {
0b00100,
0b01000,
0b11111,
0b01001,
0b00101,
0b00001,
0b00001,
0b11111
};
//Custom arrow char
byte arrow[8] = {
0b01000,
0b00100,
0b00010,
0b11111,
0b00010,
0b00100,
0b01000,
0b00000
};
//icona temperatura
byte termometro[8] =
{
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
};
//icona goccia umidità
byte umidit[8] =
{
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110,
};
void setup() {
lcd.init();
lcd.backlight();
lcd.begin(20,4);
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
Serial.print ("sei nel void setup");
// abilito le resistenze di pullup sui pulsanti
// for (int i = 0; i < numOfInputs; i++) {
//
// pinMode(inputPins[i], INPUT_PULLUP);
// //digitalWrite(inputPins[i], 1); // pull-up 20k
//
//
// }
// Declare pin modes
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(led, OUTPUT);
lcd.createChar(1, back);
lcd.createChar(2, arrow);
lcd.createChar(0, gradi);
lcd.createChar(3, termometro);
lcd.createChar(4, umidit);
//***********************setup impostazione temp/umidità*****//
// pinMode(powerLCD_pin, OUTPUT); // pressione del pulsante
// digitalWrite(powerLCD_pin, HIGH); //Accendo LCD
// lcd.createChar(0, gradi);
// lcd.begin(16, 2);
// lcd.begin(16, 2);
// lcd.setCursor(0, 0);
// lcd.print(" Lievita 1.0 ");
// pinMode(um,INPUT_PULLUP);
// pinMode(temp,INPUT_PULLUP);
// pinMode(seleziona, INPUT_PULLUP);
// // Abilitazione delle resistenze di PullUp interne sugli ingressi
// digitalWrite (um, HIGH);
// digitalWrite (temp, HIGH);
// digitalWrite (seleziona, HIGH);
//inizializzazione display
// lcd.clear();
// lcd.setCursor (3, 0);
// lcd.print ("Livello 1");
// lcd.setCursor(0, 1);
// lcd.print("T= ");
//
// lcd.setCursor(10, 1);
// lcd.print("U= ");
//******************//
}
//---- De-bouncing function for all buttons----//
boolean debounce(boolean last, int pin)
{
boolean current = digitalRead(pin);
if (last != current)
{
delay(5);
current = digitalRead(pin);
}
return current;
}
void loop() {
Serial.print("entrato void loop");
current_up = debounce(last_up, up); //Debounce for Up button
current_sel = debounce(last_sel, sel); //Debounce for Select button
current_down = debounce(last_down, down); //Debounce for Down button
current_ent = debounce(last_ent, ent); //Debounce for Down button
Serial.print("subpage counter == ");
Serial.print (subpage_counter);
//----Page counter function to move pages----//
if (subpage_counter == 0 && subpage2_counter == 0) { // up/down buttons enabled if subcounters are 0,Disabled if 1,2..etc to work on submenus
Serial.print("last up = ");
Serial.print (last_up);
Serial.print(current_up);
//Page Up
if (last_up == LOW && current_up == HIGH) { //Up button pressed
Serial.print ("last up premuto");
verifica_ent = 0;
lcd.clear(); //Clear lcd if page is changed to print new one
if (page_counter < 6) { //Page counter never higher than 6(total of pages)
page_counter = page_counter + 1; //Page up
}
else {
page_counter = 6; //If higher than 3 (last page) stay on page 3(change to 1 if you want to rotate)
}
}
last_up = current_up; //Save up button last state
//Page Down
if (last_down == LOW && current_down == HIGH) { //Down button pressed
verifica_ent = 0;
lcd.clear(); //Clear lcd if page is changed to print new one
if (page_counter > 1) { //Page counter never lower than 1 (total of pages)
page_counter = page_counter - 1; //Page down
}
else {
page_counter = 1; //If lower than 1(first page) stay on page 1(change to 3 if you want to rotate)
}
}
last_down = current_down; //Save down button last state
}
//------- Switch function to write and show what you want---//
switch (page_counter) {
case 1: { //Design of home page 1
if (verifica_ent == 0) {
lcd.setCursor(1, 0);
lcd.print(">");
lcd.setCursor(2, 0);
lcd.print("Fermo biga");
lcd.setCursor(2, 1);
lcd.print("Lievitazione");
Serial.print ("lastsel3");
Serial.print (last_sel);
}
if (last_ent == LOW && current_ent == HIGH) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Fermo biga");
lcd.setCursor(1, 1);
lcd.write(byte(3)); //simbolo temperatura
lcd.setCursor(5, 1);
lcd.write (byte (0)); //simbolo dei gradi °
lcd.setCursor(6, 1);
lcd.print("C");
lcd.setCursor(9, 1);
lcd.write(byte(4)); //simbolo umidità
lcd.setCursor(13, 1);
lcd.print("%");
lcd.setCursor(15, 1);
lcd.write(byte(1)); //Return custom char
lcd.setCursor(3, 1);
lcd.print(temperatura);
lcd.setCursor(11, 1);
lcd.print("0");
lcd.setCursor(12, 1);
lcd.print(umidita);
verifica_ent = verifica_ent + 1;
}
ealiel:
Il sito del produttore non parla di resistenze di pullup e quindi non le ho messe. Indicano di collegare direttamente.
Quando parli di un prodotto metti sempre il link ad esso, così anche noi possiamo andare a vedere di cosa si tratta ... e cercare di capire ...
Guglielmo
Ok, e se usi SOLO il programma di esempio che è su quella pagina, in display funziona ?
Guglielmo
Scusami per il ritardo nella risposta. Allora. Il display funziona, provato con scanner per leggere l'indirizzo e controllato con sketch test del venditore per saggiarne il funzionamento. Se si tratti di visualizzare stampare a video dell info non c'è nessun problema. Quindi il display è collegato bene. Il problema è che quando inserisco nel mio sketch la libreria i2c , anche con display scollegato, lo sketch si interrompe nella prima parte, ovvero dove si tratta di visualizzare semplicemente info. I pulsanti non vengono proprio tenuti in considerazione. E' come se lo sketch si bloccasse. Ho provato di tutto , cambiano parametri, modificando cavetti, modificando pin. Nulla. Lo sketch si interrompe ed i pulsanti non funzionano. Sono sicuro si interrompa perchè ho inserito delle flag di controllo in varie sezioni importanti del codice.
Guido
Prova a commentare o togliere questa riga
pinMode(blue, OUTPUT);
sempre che tu stia usando una UNO
brunello22:
Prova a commentare o togliere questa rigapinMode(blue, OUTPUT);
sempre che tu stia usando una UNO
Giusto !!!
... non avevo notato che per il "blue" sta usando lo stesso pin usato dall'I2C (A5), cosa che, ovviamente, NON è fattibile.
Guglielmo
GRANDISSIMI! Perdonatemi il maiuscolo ma era d'obbligo. Non era la riga che mi avete indicato ma erano proprio tutti i riferimenti (dichiarazioni richiami ecc) a quella riga di codice che mi creavano problemi, relativi proprio ad A5. Anche se ho collegato l'i2c sulle porte dedicate di arduino uno r3 ho capito solo ora che , a quanto ho letto, sono collegate in parallelo ad A5 e A4 e quindi o le porte dedicate Scl Sda o A5 A4 cambia niente. Nel momento in cui ho eliminato il tutto (era codice che volevo implementare e che farò in seguito) il tutto ha ricominciato a funzionare. Ho imparato una cosa nuova e mi avete risolto un grande problema.Non si finisce mai di imparare. Devo approfondire la questione i2c :D.
Abito a Novara , se siete vicini oppure di passaggio fate un fischio, birra offerta
Grazie ancora
Guido
Grazie mille .
Guido