Schermo spento arduino si blocca

Salve sono nuovo, sto costruendo una serra. Il problema che mi si è presentato, per il momento, e che se collego lo schermo, che ora rimane sempre spento, prima funzionava, se collego la linea scl si blocca Arduino e non visualizzo più i dati. Le resistenze da 10k ci sono, ho provato ad alimentarlo con Arduino o con alimentatore esterno, la linea i2c è presente, ho provato sketch di prova ma niente.. cosa posso fare?

Buongiorno,
per prima cosa ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di farla al più presto. :wink:

Ok grazie

Beh, dato che non abbiamo la palla di vetro :smiley: ... intanto comincia con mettere lo schema di TUTTI i collegamenti che hai (incluse le alimentazioni) ed il programma che stai usando (mi raccomando il codice, dopo essere stato inserito, va selezionato e va premuta l'icona </> nella barra degli strumenti per contrassegnarlo, appunto, come codice).

Lo schema dei collegamenti va bene anche disegnato a mano, purchè sia chiaro e completo :wink:

Guglielmo

spero di averlo postato nel modo coretto.
inizialmente il tutto sembrava funzionare, a parte "if bad" e "if pompa" che non si accendevano e spegnevano nel modo corretto. comunque un problema alla volta.
ora devo risolvere il problema dello schermo. in seguito posto anche i collegamenti

[code]
//DHT22 TEMPERATURA & UMIDITA
#include <SimpleDHT.h> //ambiente temperatura umidita dth22
SimpleDHT22 dht22(2);
float tempe;
float hum ;

//VENTOLA
#define PIN_VENTOLA 6
int VENTOLA = LOW;

//SONDA TEMPERATURA DS1820
#include <DallasTemperature.h>       //Temperatura sonda
#include <OneWire.h>
OneWire oneWire(12);                  //sonda pin 12 digitale gestisce comunicazione
DallasTemperature temp(&oneWire);
float tc;

//TAPPETO RISCALDANTE
bool BED = LOW;
int t_on_bed = 1000;
int statobed = LOW;
#define PIN_BED 4

//SCHERMO 129X64 SSD1306
#include <U8g2lib.h>  //schermo pin A4, A5
#include <U8x8lib.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);


//OROLOGIO DS3231
#include "RTClib.h"                  //orologio pin A4, A5
RTC_DS3231 rtc;
char *res = malloc(5);// x aggiungere lo 0
String pad(int n) {

  sprintf(res, "%02d", n); //es. 00, 01, 02....10
  return String(res);

} //pad: per aggiungere lo 0 es. 01/01/2021 aggiungere anche char *res = malloc(5);
int  hh, mm;

#include <Wire.h>             //comunicazione I2C

unsigned long t1, dt1, t2, dt2, t3, dt3, t4, dt4;   //Timer dt=differenza tempo tra millis(accensione scheda) e t=tempo(inizia con 0 poi riparte con millis)

//LUCE TSL2591
#include <Adafruit_Sensor.h>                               //sensore Lux
#include <Adafruit_TSL2591.h>
Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591);
#define PIN_LAMP 10
bool LAMP;
bool GIORNO;
int Lux;

//POMPA
#define PIN_POMPA 8
int terra;                        //umidità terreno 0, 1023
bool POMPA;
int t_on_pompa = 1000;
int statopompa = LOW;


void setup() {
  Serial.begin(9600);           //velocità comunicazione tra arduino e il computer

  Wire.begin();     //I2C

  temp.begin();     //sonda temperatura

  u8g2.begin();     //schermo

  rtc.begin();     //orologio

  if (rtc.lostPower()){
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  
  tsl.begin();     //sensore lux

  pinMode(PIN_LAMP, OUTPUT);  //pin10
  pinMode(PIN_BED, OUTPUT);   //pin4
  pinMode(PIN_POMPA, OUTPUT); //pin8
  pinMode(PIN_VENTOLA, OUTPUT); //pin6

  digitalWrite(PIN_LAMP, HIGH);
  digitalWrite(PIN_BED, HIGH);
  digitalWrite(PIN_POMPA, HIGH);
  digitalWrite(PIN_VENTOLA, HIGH);

  leggiOra();
  leggiLuce();
  leggiTemperaturaBed();
  leggiTerra();
  leggiAmbiente();

}

void loop() {
  dt1 = millis() - t1;     // Timer: differenza tempo tra millis e t1. t1 è preso dal tempo accensiome scheda. A fine ciclo riparte con t1
  if (dt1 >= 2000) {
    t1 = millis();
    leggiLuce();
    leggiOra();
    leggiTemperaturaBed();
    leggiTerra();
    leggiAmbiente();
  }

  dt2 = millis() - t2;           //Timer aggiornamento display
  if (dt1 >= 1000) {
    t2 = millis();
    aggiornaDisplay();
  }

  

  digitalWrite(PIN_LAMP, LAMP);
  digitalWrite(PIN_VENTOLA, VENTOLA);
  digitalWrite(PIN_POMPA, POMPA);
  digitalWrite(PIN_BED, BED);
}

void leggiAmbiente() {
  dht22.read2(&tempe, &hum, NULL);
  tempe;
  hum;
  Serial.print(tempe);
  Serial.println (" C ambiente");
  Serial.print(hum);
  Serial.println(" % ambiente");

  if (hum > 80) {
    VENTOLA = LOW; //VENTOLA ACCESA
  } else {
    VENTOLA = HIGH;
    digitalWrite(PIN_VENTOLA, LOW);//VENTOLA SPENTA
  }
}

void leggiTerra() {
  terra = 0;
  for (int i = 0; i < 10; i++) {
    terra += analogRead(A0); //sonda terreno pin A0
  }
  terra = terra / 10;
  terra = map(terra, 720, 375, 0, 100); //1023 asciutto, 300 saturo  d acqua
  Serial.print("umidita terreno ");
  Serial.print(terra);
  Serial.println(" %");

  if (terra < 5) {
    POMPA = LOW; //POMPA ACCESA
  } else if (terra > 30) {
    POMPA = HIGH;
    digitalWrite(PIN_POMPA, HIGH); //POMA SPENTA
  }

  if (POMPA) {
    dt4 = millis() - t4;
    if (dt4 >= t_on_pompa) {
      t4 = millis();
      statopompa = !statopompa;
      if (statopompa) {
        digitalWrite(PIN_POMPA, LOW); //POMPA ACCESA
        t_on_pompa = 1000;
      } else {
        digitalWrite(PIN_POMPA, HIGH); //POMA SPENTA
        t_on_pompa = 60000;
      }
    } else {
      digitalWrite(PIN_POMPA, HIGH); //POMPA SPENTA
    }
  }
}

void leggiTemperaturaBed() {
  temp.requestTemperatures();         //comanda lettura sensore
  tc = temp.getTempCByIndex(0);
  Serial.print(tc);
  Serial.println(" C°terra");

  if (tc < 20) {
    BED = LOW; //TEMPERATURA ACCESA
  } else if ( tc > 25) {
    BED = HIGH;
    digitalWrite(PIN_BED, HIGH); //TEMPERATURA SPENTA
  }

  /*if (BED) {
    dt3 = millis() - t3;
    if (dt3 >= t_on_bed) {
      t3 = millis();
      statobed = !statobed;
      if (statobed) {
        digitalWrite(PIN_BED, HIGH);
        t_on_bed = 5000;
      } else {
        digitalWrite(PIN_BED, LOW);
        t_on_bed = 5000;
      }
    }
  }*/ else {
    digitalWrite(PIN_BED, HIGH);
  }
}

void leggiLuce() {

  uint32_t lum = tsl.getFullLuminosity();
  uint16_t ir, full;
  ir = lum >> 16;
  full = lum & 0xFFFF;
  Lux = tsl.calculateLux(full, ir);
  Serial.print(tsl.calculateLux(full, ir));
  Serial.println(" Lux");

  if (GIORNO) {
    if (Lux > 1000) {
      LAMP = HIGH; //LUCE SPENTA
    } else if (Lux < 950) {
      LAMP = LOW; //LUCE ACCESA
    }
  } else {
    digitalWrite(PIN_LAMP, HIGH);
  }
}

void leggiOra() {
  DateTime now = rtc.now();
  hh = now.hour();
  mm = now.minute();

  if ( (hh >= 6) && (hh < 22) ) {
    GIORNO = true;
  } else {
    GIORNO = false;
  }
}

void aggiornaDisplay() {

  u8g2.firstPage();
  do {

    u8g2.setFont(u8g2_font_amstrad_cpc_extended_8f);

    u8g2.setCursor(0, 10);
    u8g2.print(pad(hh));
    u8g2.print(":");
    u8g2.print(pad(mm));

    u8g2.setCursor(0, 20);
    u8g2.print(Lux);
    u8g2.print(" Lux ");

    u8g2.setCursor(0, 30);
    u8g2.print(tc);
    u8g2.print("C terra");

    u8g2.setCursor(0, 40);
    u8g2.print(terra);
    u8g2.print("% hum.terra");

    u8g2.setCursor(0, 50);
    u8g2.print(tempe);
    u8g2.print("C ambiente");

    u8g2.setCursor(0, 60);
    u8g2.print(hum);
    u8g2.print("% hum.amb.");

    u8g2.setFont(u8g2_font_open_iconic_all_1x_t);

    if (GIORNO) {
      u8g2.drawGlyph(120, 10, 259); //sole
    } else {
      u8g2.drawGlyph(120, 10, 223); //luna
    }

    if (LAMP) {
      u8g2.drawGlyph(120, 20, 86); //lampadina
    }

    if (BED) {
      u8g2.drawGlyph(120, 30, 168); //termostato
    }

    if (POMPA) {
      u8g2.drawGlyph(120, 40, 241); //acqua
    }

    if (VENTOLA) {
      u8g2.drawGlyph(120, 60, 205); //ventola
    }

  } while (u8g2.nextPage() );

}
[/code]

... mi autoquoto ... dov'è lo schema ? ? ? :roll_eyes:

Guglielmo

Cominciamo dal bus I2c ...

... come hai disegnato tu le resistenze da 10 K sono in SERIE alle linee che vanno ai tre devices ... SE è cosÎ ... è sbagliato! Il bus I2C va collegato direttamente ai devices e le resistenze vanno sempre collegate al bus e verso il +Vcc.

Tutorial sul bus I2C.

Guglielmo

ho sbagliato a disegnare

questo e il massimo che sono riuscito ad ottenere, poi lo schermo non si ripulisce più e arduino si blocca, anche la seriale

Posso consigliarti di buttare via le pesantissime librerie U8xxxx e, per il SSD1306, usare l'ottima libreria (che io uso sempre con quei display OLED) di Rinky-Dink Electronics che trovi QUI assieme a tante altre belle cosette ... :slight_smile:

Ah ... un'altra cosa importante, i collegamenti con il bus I2C devono essere il più corti possibile e passare lontai da fonti di disturbi ... ti ricordo che I2C sta per Inter-Integrated Circuit ovvero è nato per collegamenti tra IC sulla stessa board e NON in giro con fili vari ... :roll_eyes:

Guglielmo

ciao sono abbastaza frustrato e frettoloso. ho provato a caricare un esempio e mi dice:

OLED_I2C_3D_Cube:37:10: fatal error: OLED_I2C.h: No such file or directory

#include <OLED_I2C.h>

      ^~~~~~~~~~~~

compilation terminated.

exit status 1

OLED_I2C.h: No such file or directory

... la fretta NON porta mai da nessuna parte. O fai le cose con calma e pazienza o NON vai da nessuna parte.

Quella libreria, se correttamente installata, funziona PERFETTMENTE, quindi ... pulisci la tua installazione, fai un'installazione corretta e prova gli esempi a corredo della libreria.

Guglielmo

hai ragione.... ho installato le librerie correttamente, ho ridotto la lungezza dei cavi scl e sda; pero ancora nulla, lo schermo si accende, ma al posto del cubo che si muove vedo una linea orizzontale

schermo rotto?

... li hai provati ?

Guglielmo

ho provato gli esempi, non funzionano

Scollega TUTTO, lasci collegato solo lo schermo e le resistenze di pull-up, dopo di che riprovi gli esempi ... :roll_eyes:

Guglielmo

e gia tutto scollegato, ho provato ad alimentarlo solo con arduino e con l alimentatore ma niente. schermo difettoso?