Se sei già registrato           oppure    

Orario: 02/05/2024 14:59:57  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

Pagine: (5)   1   [2]   3   4   5    (Ultimo Msg)


Termostato con isteresi regolabile
FinePagina

Claudio

Avatar
PetaWatt


Gruppo:MODERATORE
Messaggi:15112

Stato:



Inviato il: 27/06/2017 19:26:47

Mi da errore sulla linea 103 lcd.write(0); ma bloccandola va perfetto, è per caso anche lei inerente al display I2C??



---------------
Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 27/06/2017 21:33:23

Altre piccole modifiche e correzioni...


#include <LiquidCrystal.h>                                      // Per display normale
#include <LiquidCrystal_I2C.h>                                  // Per display I2C
#include <EEPROM.h>                                             // Per memorizzare le soglie nella EPROM di Arduino
#define on 6                                                    // Led Verde o Relay NA
#define off 7                                                   // Led Rosso o Relay NC
#define tempP 9                                                 // Pulsante Temperatura "+"
#define tempM 8                                                 // Pulsante Temperatura "-"
#define isterP 10                                               // Pulsante Isterisi "+"
#define isterM 13                                               // Pulsante Isterisi "-"
#define LM35 A1                                                 // Piedino centrale sensore temp. LM35

int i;                                                          // variabile per cicli for
int nread = 10;                                                 // Numero di letture effettuate dall'ADC
int power;                                                      // Variabile per lampeggio puntino di running del termostato
int rele = 0;                                                   // Variabile di stato dei relè: 0 = OFF, 1 = ON
int byte0, byte1;                                               // Variabili usate per scrivere/leggere nella Eprom
float vref = 1.1;                                               // ADC 1,1V
int isteresi;                                                   // Isteresi del termostato: lavoro con int (moltiplicati per 10) per evitare errori di arrotondamenti sui float
int tempSoglia;                                                 // Temperatura di Soglia: lavoro con int (moltiplicati per 10) per evitare errori di arrotondamenti sui float
float tempLetta;
unsigned long T_Ultima_Lettura, T_Attuale;                      // Variabili per le pause senza blocco dei processi
byte newChar[8] = { B00100, B00100, B11111, B00100,             // Carattere personalizzato ±
                    B00100, B00000, B11111, B00000 }; 
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                          // LCD LiquidCrystal D2=D7 - D3=D6 - D4=D5 - D5=D4 - D11=E - D12=RS - VDD=+5 - VO=centrale potenziometro - A=+3V K, VSS, RW=massa
LiquidCrystal_I2C lcd(0x27, 16, 4);                             // Per display I2C



void setup()
{
  pinMode(on, OUTPUT);                                          // Inizializzo i Pin
  pinMode(off, OUTPUT);
  pinMode(tempP, INPUT_PULLUP);
  pinMode(tempM, INPUT_PULLUP);
  pinMode(isterP, INPUT_PULLUP);
  pinMode(isterM, INPUT_PULLUP);
  analogReference(INTERNAL);                                    // Setto il riferimento per l'ADC al valore interno di 1,1V
  tempLetta = (100.0 * vref * (float)analogRead(LM35)) / 1024.0; // Leggo la Temperatura


  // Leggo la Temperatura Impostata nella Eprom
  byte0 = EEPROM.read(0);
  byte1 = EEPROM.read(1);
  tempSoglia = (byte1<<8) | byte0;                                // Somma logica del valore di Byte1 spostato a sinistra di 8 bit e di Byte0
  if (tempSoglia < 100 || tempSoglia > 900) tempSoglia = 250;


  // Leggo l'Isteresi Impostata nella Eprom (Ho lasciato 2 Byte nel caso si volesse settare un'steresi maggiore di 25,5 °C)
  byte0 = EEPROM.read(2);
  byte1 = EEPROM.read(3);
  isteresi = (byte1<<8) | byte0;                                // Somma logica del valore di Byte1 spostato a sinistra di 8 bit e di Byte0
  if (isteresi < 1 || isteresi > 250) isteresi = 3;


  // Per display LCD 20 Colonne, 4 Righe, I2C
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  lcd.createChar(0, newChar); 



  // Per display LCD 20 Colonne, 4 Righe, normale
  // lcd.begin(20, 4);


  // Schermata di avvio del termostato
  lcd.setCursor(0, 0);
  lcd.print("Termostato");
  lcd.setCursor(2, 1);
  lcd.print("Digitale");
  lcd.setCursor(4, 2);
  lcd.print("Differenziale");
  lcd.setCursor(6, 3);
  lcd.print("Start");
  delay(500);
  for (i = 0; i < 8; i++)
  {
    lcd.print(".");
    delay(200);
  }


  // Setto le scritte statiche
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("T. Letta:    ");
  lcd.print(tempLetta, 1);
  lcd.setCursor(18,0);
  lcd.print((char)223);
  lcd.print("C");

  lcd.setCursor(0,1);
  lcd.print("Rele':");
  
  lcd.setCursor(0,2);
  lcd.print("T. Impost.:  ");
  lcd.print((float)tempSoglia/10, 1);
  lcd.setCursor(18,2);
  lcd.print((char)223);
  lcd.print('C');

  lcd.setCursor(0,3);
  lcd.print("Isteresi  ");
  lcd.write(0);
  lcd.print(":  ");
  lcd.print((float)isteresi/10, 1);
  lcd.setCursor(18,3);
  lcd.print((char)223);
  lcd.print('C');
}



void loop()
{
  float temp;

  T_Attuale = millis();
  if (T_Attuale - T_Ultima_Lettura > 500)                      // Attendo 1 secondo
  {
    readTemp();                                                 // Leggo la temperatura
    attivaRele();                                               // Setto i relè
    LCD(0);                                                     // Aggiorno i valori sull'LCD
    T_Ultima_Lettura = T_Attuale;
  }

  // Modifica Temperatura Centro Soglia da 10 a 90 °C
  if(digitalRead(tempM) == LOW && tempSoglia > 100)
  {
    tempSoglia--;
    LCD(1);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = tempSoglia & 255;                                   // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (tempSoglia >> 8) & 255;                            // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(0, byte0);
    EEPROM.write(1, byte1);

    delay(150);
  }
  if(digitalRead(tempP) == LOW && tempSoglia < 900)
  {
    tempSoglia++;
    LCD(1);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = tempSoglia & 255;                                   // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (tempSoglia >> 8) & 255;                            // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(0, byte0);
    EEPROM.write(1, byte1);

    delay(150);
  }

  // Modifica Isteresi (da +/- 0,1 a +/- 25 °C)
  if(digitalRead(isterM) == LOW && isteresi > 1)
  {
    isteresi--;
    LCD(2);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = isteresi & 255;                                     // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (isteresi >> 8) & 255;                              // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(2, byte0);
    EEPROM.write(3, byte1);

    delay(150);
  }
  
  if(digitalRead(isterP) == LOW && isteresi < 250)
  {
    isteresi++;
    LCD(2);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = isteresi & 255;                                     // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (isteresi >> 8) & 255;                              // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(2, byte0);
    EEPROM.write(3, byte1);

    delay(150);
  }

}



void readTemp()                                                 // Leggo la temperatura facendo la media di 10 letture
{
  float temp;
  float somma = 0.0;
  int i, val;
 
  for (i = 0; i < nread; i++)
  {
    temp = (100.0 * vref * (float)analogRead(LM35)) / 1024.0;
    somma += temp;
    delay(10);
  }
  tempLetta = somma / (float)nread;
}


void LCD(int valore)                                            // Scrivo i valori sull'LCD
{
  switch (valore) {
    case 1:
      lcd.setCursor(13,2);
      lcd.print((float)tempSoglia/10, 1);
      break;

    case 2:
      lcd.setCursor(13,3);
      if (isteresi < 100) lcd.print(" ");
      lcd.print((float)isteresi/10, 1);
    break;

    case 3:
      lcd.setCursor(7,1);
      if (rele == 0) lcd.print("OFF");
      else lcd.print("ON ");
    break;

    default:
      lcd.setCursor(12,0);
      if (tempLetta < 10.0) lcd.print("  ");
      else if (tempLetta < 100.0) lcd.print(" ");
      lcd.print(tempLetta, 1);

      switch (power)
      {
      case 0:
        lcd.setCursor(13,1);
        lcd.print("- -----");
        power = 1;
        break;
      case 1:
        lcd.setCursor(14,1);
        lcd.print("- ");
        power = 2;
        break;
      case 2:
        lcd.setCursor(15,1);
        lcd.print("- ");
        power = 3;
        break;
      case 3:
        lcd.setCursor(16,1);
        lcd.print("- ");
        power = 4;
        break;
      case 4:
        lcd.setCursor(17,1);
        lcd.print("- ");
        power = 5;
        break;
      case 5:
        lcd.setCursor(17,1);
        lcd.print(" -");
        power = 6;
        break;
      case 6:
        lcd.setCursor(16,1);
        lcd.print(" -");
        power = 7;
        break;
      case 7:
        lcd.setCursor(15,1);
        lcd.print(" -");
        power = 8;
        break;
      case 8:
        lcd.setCursor(14,1);
        lcd.print(" -");
        power = 1;
        break;
      }
    break;
  }
}


void attivaRele()                                                         // Imposto i relè
{
  if(tempLetta < (float)tempSoglia/10 - (float)isteresi/10)               // Soglia Inferiore -
  {
    digitalWrite(on, HIGH);
    digitalWrite(off, LOW);
    rele = 0;
    LCD(3);
  }
  if(tempLetta > (float)tempSoglia/10 + (float)isteresi/10)               // Soglia Superiore +
  {
    digitalWrite(on, LOW);
    digitalWrite(off, HIGH);
    rele = 1;
    LCD(3);
  }
}


la riga 103 ( lcd.write(0); ) è quella che scrive il carattere personalizzato (ovvero disegnato da me) "±" sul display, vicino l'isteresi.

Forse per il display normale va usata altra istruzione... verificherò !



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 28/06/2017 11:40:15

Giuro che ora non modifico più !!!


#include <LiquidCrystal.h>                                      // Per display normale
#include <LiquidCrystal_I2C.h>                                  // Per display I2C
#include <EEPROM.h>                                             // Per memorizzare le soglie nella EPROM di Arduino
#define on 6                                                    // Led Verde o Relay NA
#define off 7                                                   // Led Rosso o Relay NC
#define tempP 9                                                 // Pulsante Temperatura "+"
#define tempM 8                                                 // Pulsante Temperatura "-"
#define isterP 10                                               // Pulsante Isterisi "+"
#define isterM 13                                               // Pulsante Isterisi "-"
#define LM35 A1                                                 // Piedino centrale sensore temp. LM35

int i;                                                          // variabile per cicli for
int nread = 10;                                                 // Numero di letture effettuate dall'ADC
int Posizione = 12, Direzione = 0;                              // Variabili per lampeggio trattino di running del termostato
int rele = 0;                                                   // Variabile di stato dei relè: 0 = OFF, 1 = ON
int byte0, byte1;                                               // Variabili usate per scrivere/leggere nella Eprom
float vref = 1.1;                                               // ADC 1,1V
int isteresi;                                                   // Isteresi del termostato: lavoro con int (moltiplicati per 10) per evitare errori di arrotondamenti sui float
int tempSoglia;                                                 // Temperatura di Soglia: lavoro con int (moltiplicati per 10) per evitare errori di arrotondamenti sui float
float tempLetta;
unsigned long T_Ultima_Lettura, T_Attuale;                      // Variabili per le pause senza blocco dei processi
byte PiuMeno[8] = { B00100, B00100, B11111, B00100,             // Carattere personalizzato ±
                    B00100, B00000, B11111, B00000 }; 
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                          // LCD LiquidCrystal D2=D7 - D3=D6 - D4=D5 - D5=D4 - D11=E - D12=RS - VDD=+5 - VO=centrale potenziometro - A=+3V K, VSS, RW=massa
LiquidCrystal_I2C lcd(0x27, 16, 4);                             // Per display I2C



void setup()
{
  pinMode(on, OUTPUT);                                          // Inizializzo i Pin
  pinMode(off, OUTPUT);
  pinMode(tempP, INPUT_PULLUP);
  pinMode(tempM, INPUT_PULLUP);
  pinMode(isterP, INPUT_PULLUP);
  pinMode(isterM, INPUT_PULLUP);
  analogReference(INTERNAL);                                    // Setto il riferimento per l'ADC al valore interno di 1,1V


  // Leggo la Temperatura Impostata nella Eprom
  byte0 = EEPROM.read(0);
  byte1 = EEPROM.read(1);
  tempSoglia = (byte1<<8) | byte0;                              // Somma logica del valore di Byte1 spostato a sinistra di 8 bit e di Byte0
  if (tempSoglia < 100 || tempSoglia > 900) tempSoglia = 250;


  // Leggo l'Isteresi Impostata nella Eprom (Ho lasciato 2 Byte nel caso si volesse settare un'steresi maggiore di 25,5 °C)
  byte0 = EEPROM.read(2);
  byte1 = EEPROM.read(3);
  isteresi = (byte1<<8) | byte0;                                // Somma logica del valore di Byte1 spostato a sinistra di 8 bit e di Byte0
  if (isteresi < 1 || isteresi > 250) isteresi = 3;


  // Per display LCD 20 Colonne, 4 Righe, I2C
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  lcd.createChar(0, PiuMeno); 


  // Per display LCD 20 Colonne, 4 Righe, normale
  // lcd.begin(20, 4);

  
  // Schermata di avvio del termostato
  lcd.setCursor(0, 0);
  lcd.print("Termostato");
  lcd.setCursor(2, 1);
  lcd.print("Digitale");
  lcd.setCursor(4, 2);
  lcd.print("Differenziale");
  lcd.setCursor(6, 3);
  lcd.print("Start");
  delay(500);
  for (i = 0; i < 8; i++)
  {
    lcd.print(".");
    delay(200);
  }


  // Setto le scritte statiche
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("T. Letta:");
  readTemp();
  LCD(0);
  lcd.setCursor(18,0);
  lcd.print((char)223);
  lcd.print("C");

  lcd.setCursor(0,1);
  lcd.print("Rele':       -------");
  
  lcd.setCursor(0,2);
  lcd.print("T. Impost.:");
  LCD(1);
  lcd.setCursor(18,2);
  lcd.print((char)223);
  lcd.print("C");

  lcd.setCursor(0,3);
  lcd.print("Isteresi ");
  lcd.write(byte(0));
  lcd.print(":");
  LCD(2);
  lcd.setCursor(18,3);
  lcd.print((char)223);
  lcd.print("C");
}



void loop()
{
  T_Attuale = millis();
  if (T_Attuale - T_Ultima_Lettura > 500)                       // Attendo 0,5 secondi
  {
    readTemp();                                                 // Leggo la temperatura
    attivaRele();                                               // Setto i relè
    LCD(0);                                                     // Aggiorno i valori sull'LCD
    T_Ultima_Lettura = T_Attuale;
  }

  // Modifica Temperatura Centro Soglia da 10 a 90 °C
  if(digitalRead(tempM) == LOW && tempSoglia > 100)
  {
    tempSoglia--;
    LCD(1);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = tempSoglia & 255;                                   // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (tempSoglia >> 8) & 255;                            // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(0, byte0);
    EEPROM.write(1, byte1);

    delay(150);
  }
  if(digitalRead(tempP) == LOW && tempSoglia < 900)
  {
    tempSoglia++;
    LCD(1);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = tempSoglia & 255;                                   // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (tempSoglia >> 8) & 255;                            // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(0, byte0);
    EEPROM.write(1, byte1);

    delay(150);
  }

  // Modifica Isteresi (da +/- 0,1 a +/- 25 °C)
  if(digitalRead(isterM) == LOW && isteresi > 1)
  {
    isteresi--;
    LCD(2);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = isteresi & 255;                                     // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (isteresi >> 8) & 255;                              // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(2, byte0);
    EEPROM.write(3, byte1);

    delay(150);
  }
  
  if(digitalRead(isterP) == LOW && isteresi < 250)
  {
    isteresi++;
    LCD(2);                                                     // Scrivo sull'LCD
    
    // Salvo il valore nella Eprom
    byte0 = isteresi & 255;                                     // Con un prodotto logico per 255 ottengo gli 8 bit meno significativi
    byte1 = (isteresi >> 8) & 255;                              // Con uno spostamento a sinistra ed il prodotto logico ottengo gli 8 bit più significativi
    EEPROM.write(2, byte0);
    EEPROM.write(3, byte1);

    delay(150);
  }

}



void readTemp()                                                 // Leggo la temperatura facendo la media di 10 letture
{
  float somma = 0.0;
 
  for (i = 0; i < nread; i++)
  {
    somma += (100.0 * vref * (float)analogRead(LM35)) / 1024.0;
    delay(10);
  }
  tempLetta = somma / (float)nread;
}



void LCD(int valore)                                            // Scrivo i valori sull'LCD: 0 = Temperatura Letta + Animazione, 1 = Temperatura Impostata, 2 = Isteresi Impostata, 3 = Stato Relè
{
  switch (valore) {
    case 1:                                                     // Temperatura Impostata
      lcd.setCursor(13,2);
      lcd.print((float)tempSoglia/10, 1);
      break;

    case 2:                                                     // Isteresi Impostata
      lcd.setCursor(13,3);
      if (isteresi < 100) lcd.print(" ");
      lcd.print((float)isteresi/10, 1);
    break;

    case 3:                                                     // Stato Relè
      lcd.setCursor(7,1);
      if (rele == 0) lcd.print("OFF");
      else lcd.print("ON ");
    break;

    default:                                                    // Temperatura Letta
      lcd.setCursor(12,0);
      if (tempLetta < 10.0) lcd.print("  ");
      else if (tempLetta < 100.0) lcd.print(" ");
      lcd.print(tempLetta, 1);
      
      if (Direzione == 0)                                       // Animazione "Supercar"
      {
        lcd.setCursor(Posizione, 1);
        lcd.print("- ");
        Posizione++;
        if (Posizione == 18) Direzione = 1;
      }
      if (Direzione == 1)
      {
        lcd.setCursor(Posizione, 1);
        lcd.print(" -");
        if (Posizione == 14) Direzione = 0;
        else Posizione--;
      }
    break;
  }
}


void attivaRele()                                               // Imposto i relè
{
  if(tempLetta < (float)tempSoglia/10 - (float)isteresi/10)     // Soglia Inferiore -
  {
    digitalWrite(on, HIGH);
    digitalWrite(off, LOW);
    rele = 0;
    LCD(3);
  }
  if(tempLetta > (float)tempSoglia/10 + (float)isteresi/10)     // Soglia Superiore +
  {
    digitalWrite(on, LOW);
    digitalWrite(off, HIGH);
    rele = 1;
    LCD(3);
  }
}


Claudio prova ora se con l'istruzione " lcd.write ( byte(0) ); " funziona senza errori...

Puoi postare una foto del tuo display in funzione ?



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

Claudio

Avatar
PetaWatt


Gruppo:MODERATORE
Messaggi:15112

Stato:



Inviato il: 28/06/2017 16:04:35

Tutto OK

Elix fa pure tutte le modifiche che ritieni opportuno.



Immagine Allegata: disp.jpg
 
ForumEA/R/disp.jpg



---------------
Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.

 

Claudio

Avatar
PetaWatt


Gruppo:MODERATORE
Messaggi:15112

Stato:



Inviato il: 28/06/2017 16:22:01

Purtroppo il carattere 241 lo visualizza come "q" e il personalizzato si fa gli affari suoi.



---------------
Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.

 

Claudio

Avatar
PetaWatt


Gruppo:MODERATORE
Messaggi:15112

Stato:



Inviato il: 28/06/2017 17:35:55

Non c'è verso, magari cambiando font??? ho risolto così.



Immagine Allegata: disp.jpg
 
ForumEA/R/disp_1.jpg



---------------
Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 28/06/2017 18:00:43

Una domanda, perchè hai scelto l'LM35 che è analogico e non un sensore digitale?



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

Claudio

Avatar
PetaWatt


Gruppo:MODERATORE
Messaggi:15112

Stato:



Inviato il: 28/06/2017 18:13:36

Non so, bella domanda, forse perché nella scatolina ce ne sono 5, ho anche un DHT11



---------------
Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 28/06/2017 18:24:51

Il DHT11 è digitale, ha una sua libreria e legge temperatura ed umidità.



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 28/06/2017 23:38:13

CITAZIONE (Claudio, 28/06/2017 16:22:01 ) Discussione.php?214676&2#MSG19

Purtroppo il carattere 241 lo visualizza come "q" e il personalizzato si fa gli affari suoi.

Cioè lcd.write ( byte(0) ); non da nessun errore ma stampa quello strano carattere ???
Non è questione di font, io dico all'LCD quali "pixel" deve accendere per formare il carattere ma nel tuo ci dev'essere qualcosa che non funziona... Vedo di fare qualche prova con un LCD senza I2C !


CITAZIONE
Una domanda, perchè hai scelto l'LM35 che è analogico e non un sensore digitale.

Per fare delle prove ne avevo acquistati un pacco da 5 a un paio di euro: non sono riuscito a farli funzionare !
Cioè alimentati a 5 volt, senza collegare nulla in uscita, assorbivano tra i 100 è i 200 mA, scaldandosi oltre i 60° in pochi secondi.
C'è poco da sbagliare, Vcc, GND e Out (centrale).
Per scrupolo, su uno nuovo, ho provato ad alimentarlo al contrario ma non è cambiato nulla.
Eppure su internet ci sono migliaia di utenti che li usano senza problemi... Alla fine li ho gettati tutti e 5 e sono passato ai digitali !

Elix



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

Claudio

Avatar
PetaWatt


Gruppo:MODERATORE
Messaggi:15112

Stato:



Inviato il: 29/06/2017 00:11:36

Aaaa, quindi ogni stringa tipo B11001 ripetuta 8 volte dice che pixel accendere nella mappa 5x8

Studio.



---------------
Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 29/06/2017 01:16:53

CITAZIONE (Claudio, 29/06/2017 00:11:36 ) Discussione.php?214676&2#MSG25

Aaaa, quindi ogni stringa tipo B11001 ripetuta 8 volte dice che pixel accendere nella mappa 5x8

Studio.


Esatto !
Ti di un aiutino: ogni riga è formata da 5 pixel, quindi se il bit corrispondente è a 1 il pixel è nero e viceversa.
Il tuo esempio B11001 accenderà il pixel 1, 2 e 5.
Gli altri a seguire...

http://www.energialternativa.info/public/newforum/ForumEA/R/image.jpg



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 29/06/2017 06:47:59


CITAZIONE

Per fare delle prove ne avevo acquistati un pacco da 5 a un paio di euro: non sono riuscito a farli funzionare !


Strano, personalmente preferisco i digitali ds18B20, ma gli LM35 sono molto usati. Vanno alimentati e sul centrale restituiscono una tensione proporzionale alla temperatura. Nell'immagine della pagina precedente il sensore di colore azzurro che hai usato, cos'era?


Gli LCD con I2C sono sempre LCD seriali SPI con l'aggiunta di una scheda basata sul pcf8574 che fa da interfaccia. Lavorano sempre allo stesso modo.



Modificato da calcola - 29/06/2017, 06:56:39


---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 29/06/2017 09:22:15

CITAZIONE (calcola, 29/06/2017 06:47:59 ) Discussione.php?214676&2#MSG27


CITAZIONE
Per fare delle prove ne avevo acquistati un pacco da 5 a un paio di euro: non sono riuscito a farli funzionare !


Strano, personalmente preferisco i digitali ds18B20, ma gli LM35 sono molto usati. Vanno alimentati e sul centrale restituiscono una tensione proporzionale alla temperatura. Nell'immagine della pagina precedente il sensore di colore azzurro che hai usato, cos'era?


Gli LCD con I2C sono sempre LCD seriali SPI con l'aggiunta di una scheda basata sul pcf8574 che fa da interfaccia. Lavorano sempre allo stesso modo.

Infatti, non so perché non funzionavano, una partita difettosa ?

Quello azzurro è un piccolo potenziometro smontato da non ricordo dove !

Secondo te come mai a Claudio si visualizza quello strano carattere al posto del simbolo Più Meno ???



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 29/06/2017 10:02:50

Non ho mai impostato caratteri personalizzati, ricordo però che in un codice demo degli LCD i caratteri personalizzati funzionavano.



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 
 InizioPagina
 

Pagine: (5)   1   [2]   3   4   5    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum