Go Down

Topic: Misuratore Ampere / Volt / Continuità per pista Slot (Read 10256 times) previous topic - next topic

Etemenanki

Ma le cifre che "flashano" nel video, sono cosi anche ad occhio, o e' un'effetto dovuto alla camera ? ... perche' cosi e' "leggermente" illeggibile ;)

... poi ... ma e' un dubbio personale ... dato che usi due display da 1.8 in verticale, affiancati come se fossero uno solo, mi viene da chiedermi perche' non ne hai semplicemente preso uno grosso il doppio mettendolo in orizzontale ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ricki158

Si, flashano esattamente come si vede anche ad occhio nudo, non è un effetto della camera.

Ne ho messi due per diversi motivi: costi inferiori, divisione delle corsie, ma soprattutto avevo paura che soltanto con una Mega sarei potuto stare dietro ad un display più grande.

Siccome non ne sapevo granché sui display tft (e non è che nel frattempo sono diventato un'esponente di spicco in questo campo :D) ed ho chiesto anche qui sul forum che cosa era meglio usare non ricevendo risposte, ho fatto questa scelta vedendo un po' in giro che cosa si utilizza.

Etemenanki

Vero, e neppure io sono un'esperto nel campo ... ma se usassi uno di quelli da 3.5, che costano sui 9 Euro, il prezzo non sarebbe eccessivo ... inoltre potresti sempre usare il sistema delle 2 MCU, magari con una scheda fatta su misura, dove ad una fai fare tutte le misure e le conversioni, ed all'altra fai fare tutto il lavoro del pilotaggio display, generazione maschere, posizionamento, eccetera ... cosi basterebbe che la prima si limitasse a "passare" i valori da visualizzare alla seconda, mentre la seconda decide, in base ai tuoi comandi, quali visualizzare e come ...

Lo dico perche', confrontati con diversi video in rete, i tuoi mi sembrano molto piu lenti, e mi viene davvero il dubbio che sia dovuto anche, o soprattutto, al fatto che fai fare tutto il lavoro ad una sola MCU, che finisca per incriccarsi da qualche parte ... ma qui serve il parere di chi se ne intende di piu a livello software di me ... io da "hardwarista" avrei probabilmente diviso il lavoro su due MCU gia da subito (magari poi diventando matto a cercare di farle lavorare insieme a livello software, ma io sono fatto cosi ... hardware per primo, hardware per secondo, hardware per dessert, poi se avanza tempo e voglia e proprio non riesco a risolverla solo con l'hardware, anche un po di software come digestivo :D)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ricki158

#198
Jun 27, 2018, 12:00 pm Last Edit: Jun 27, 2018, 12:06 pm by ricki158
Mi hai fatto venire fame :D

Ad ogni modo ho paura che con un display più grande mi ritroverei comunque dei problemi ad usare anche un Arduino UNO. Nel frattempo però vorrei usare quello che ho, ovvero i due display da 1.8". Ho già preparato schema elettrico e board per fare una schedina sulla quale si collega sia il display sia l'Arduino Pro Micro, con le resistenze appropriate, nel caso in cui ci sia qualcuno che mi confermi il fatto che ci vuole un ATMega32U4 per ogni display.

In tal caso comunque la comunicazione volevo gestirla via i2c, da un Arduino Pro Micro MASTER e i due Arduino Pro Micro SLAVE che fanno solo da riceventi per la gestione display. La MASTER effettua tutte le richieste dati tramite sempre i2c ai due convertitori AD, la misura per i due pulsanti, la comunicazione tramite libreria con il DHT11. Che ne dici?

p.s.: sempre da internet guarda questo:
http://matthewcmcmillan.blogspot.com/2014/01/arduino-improving-refresh-rate-of-tft.html

http://matthewcmcmillan.blogspot.com/2014/08/arduino-tft-lcd-display-refresh-rate-part2.html

Lui aveva lo stesso mio problema ed ha risolto prima creando un rettangolo che si colorava dello stesso colore dello sfondo, poi colorando di nero solo le cifre che cambiavano. E non ha nessun tipo di "flash" sebbene ci sia una buona quantità di pixel da scrivere. Come dici anche tu, sembra quasi esserci un problema, ma non so dove andarlo a cercare. Non è che scrivendo continuamente e saltando dal display 1 al display 2 rallento la comunicazione? Spero nell'aiuto di qualcuno che ci capisca di più.

Etemenanki

Mi hai fatto venire fame :D
Ti faccio venire ancora piu fame, allora ... perche' non una standalone grande esattamente come il display (da saldarci o impilarci sotto, in pratica), con a bordo due (dicasi "due" :D) 328P, uno che gestisce il display, ed uno che fa il resto, interconnessi direttamente ? (quasi quasi, mi viene voglia di aprire eagle solo per vedere se ci starebbero, magari in dip ... devo resistere)



Quote
.... Non è che scrivendo continuamente e saltando dal display 1 al display 2 rallento la comunicazione? ...
Infatti il mio dubbio principale era anche quello ... pero', come ho detto, non me ne intendo abbastanza a livello software, da poter "puntare il dito" e dirti "il problema e' li" ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ricki158

Infatti, ma se ho la possibilità di usare i 32u4, prendo direttamente una scheda piccola Arduino Pro Micro che sotto al display ci sta, faccio una scheda di collegamento tra il display e Arduino Pro Micro e metto un connettore a 4 pin per il positivo, il negativo, SCL e SDA e il gioco è fatto.

Più che altro perché dovrei poi programmare ogni singolo Mega e la cosa mi disturba, anche se assieme a te ho fatto il programmatore B)

Per quello che dicevo prima potrei provare eliminando tutti i riferimenti (sia il display che le scritture) sul secondo display di fatto gestendo solo un display. Se cambia il refresh allora può essere quello il problema. Nel frattempo invoco l'aiuto di qualcuno che ne sappia.

ricki158

Per quello che dicevo prima potrei provare eliminando tutti i riferimenti (sia il display che le scritture) sul secondo display di fatto gestendo solo un display. Se cambia il refresh allora può essere quello il problema. Nel frattempo invoco l'aiuto di qualcuno che ne sappia.
Ho commentato ogni riga che faceva riferimento al display2 ma lo sfarfallio è uguale. FORSE non è un problema di poca potenza di calcolo...

Etemenanki

Puoi fare un test ? ... scrivi da zero uno sketch minimo, usando lo stesso metodo di scrittura sul display che usi adesso, che si limita a far cambiare una cifra in mezzo allo sketch una volta al secondo (un banale for da 0 a 9, ad esempio, ripetuto all'infinito), e che non fa niente altro ... cosi si vede se dipende dal display in se, dallo sketch, dall'hardware, o da qualcos'altro, o almeno si ha qualche indicazione in piu su cosa potrebbe essere ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ricki158

Ok, dimmi che cosa vuoi che scriva sul display, quali caratteri statici ecc ecc.

Ieri sera comunque ho pensato ad un'altra cosa. Io sto scrivendo e cancellando subito, da qui il "flash".
Ieri sera invece ho voluto provare un delay e un "eco" delay, cioè sostanzialmente la funzione di gestione del display (modalità e cosa stampare sul display, la funzione state() ) cicla ogni 500 millisecondi. Quando faccio il ciclo inizio a contare e dopo 450 millisecondi mi scatta la funzione "eco".

Nel primo delay stampo, nel secondo delay cancello. In questo modo non ho più dei flash ma numeri stabili, un flash "nero" del testo che cambia e poi il nuovo valore.

Etemenanki

Non e' che voglio che scrivi qualcosa di specifico, basta un banale ciclo for da 0 a 9, dove scrivi in mezzo al display la variabile del for (tanto per vedere i numeri cambiare) ...

e no, non devi scrivere e cancellare subito, ne usare i delay che ti bloccherebbero tutto .. usa millis, e le due scritture (cioe' cancellazione col nero e scrittura col bianco) le fai una dopo l'altra senza ritardi nel for, tutto dentro un'if per controllare il tempo trascorso con millis ... ad esempio ...

parti con due variabili a zero (diciamo aaa e bbb ... si, lo so, che fantasia :D), una per il for ed una secondaria come "memoria" del numero precedente, ed una unsigned long per il valore precedente di millis (diciamo tempo) ... nel setup, tempo=millis ... nel loop, un'if millis meno tempo > 1000 ... nell'if, quando e' passato un secondo, bbb=aaa (per poterlo scrivere in nero cancellando), fai il for aaa eccetera, scrivi bbb in nero, subito dopo scrivi aaa in bianco ... if aaa>9 aaa=0 (tanto per far ciclare il for all'infinito) ... e cosi via ... e vediamo se sfarfalla anche con cosi poche istruzioni in questa sequenza ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ricki158

#205
Jun 28, 2018, 03:43 pm Last Edit: Jun 28, 2018, 03:44 pm by ricki158
Si ho sbagliato a dire delay, ovviamente lo faccio con millis(). Ieri ne parlavo con un amico e lui la chiamava eco delay, per questo mi è rimasto in mente.

Code: [Select]

unsigned long displayTime = millis();                 /*  */
#define displayDelay 500                              /*  */
unsigned long displayTimeEco = 0;                     /*  */
#define displayDelayEco 450                           /*  */

if (millis() - displayTime > displayDelay) {
  displayTimeEco = millis();
  displayTime += displayDelay;
  state();                                          /* funzione di gestione mode sui display */
}

if (millis() - displayTimeEco > displayDelayEco){
    state_Clean();
    displayTimeEco = 0;
}


Per la stampa semplice appena ho un attimo libero stasera lo scrivo, tanto dovrebbe essere molto semplice

ricki158

Anzi, l'ho scritto adesso:

Code: [Select]

unsigned long displayTime = millis();
#define displayDelay 500
unsigned long displayTimeEco = 0;
#define displayDelayEco 450

#define sclk 15
#define mosi 16
#define cs1 4
#define dc1 5
#define rst1 6

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

Adafruit_ST7735 display1 = Adafruit_ST7735(cs1, dc1, rst1);

byte temp = 0;

void ciclo(){
  if (temp < 9){temp++;}
  else temp = 0;
}

void print_T(){
  display1.setTextColor(ST7735_WHITE);
  display1.setTextSize(3);
  display1.setCursor(50, 65);
  display1.print(temp);
}

void print_T_Clean(){
  display1.setTextColor(ST7735_BLACK);
  display1.setTextSize(3);
  display1.setCursor(50, 65);
  display1.print(temp);
}


void setup() {

  pinMode(sclk, OUTPUT);
  pinMode(mosi, OUTPUT);
  pinMode(cs1, OUTPUT);
  pinMode(dc1, OUTPUT);
  pinMode(rst1, OUTPUT);
 
  display1.initR(INITR_BLACKTAB);
  display1.fillScreen(ST7735_BLACK);

}

void loop() {
 
  ciclo();
 
  if (millis() - displayTime > displayDelay) {
    displayTimeEco = millis();
    displayTime += displayDelay;
    print_T();
  }

  if (millis() - displayTimeEco > displayDelayEco){
      print_T_Clean();
      displayTimeEco = 0;
  }
}


Questo sketch di prova va bene? E' così che intendevi?

Etemenanki

non ne sono sicuro perche', come ho detto, quei display non li ho, quindi non so usarli bene ... intendevo una cosa del genere, molto a spanne e da completare *(dove ho messo il testo fra parentesi ed asterischi, i comandi precisi li devi mettere tu che conosci meglio il display e come l'hai inizializzato)*

Code: [Select]

#define sclk 15 
#define mosi 16
#define cs1 4
#define dc1 5
#define rst1 6
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
Adafruit_ST7735 display1 = Adafruit_ST7735(cs1, dc1, rst1);

void setup() {
   pinMode(sclk, OUTPUT);
   pinMode(mosi, OUTPUT);
   pinMode(cs1, OUTPUT);
   pinMode(dc1, OUTPUT);
   pinMode(rst1, OUTPUT);
   display1.initR(INITR_BLACKTAB);
   display1.fillScreen(ST7735_BLACK); //questi suppongo puliscano il display in nero
   unsigned long tempo = millis();
   byte stato = 0;
   byte prec = 0;
  *(qui stampa la variabile stato in bianco)*
}

//la parte sopra l'ho copiata quasi tutta dal tuo, spero sia corretta

void loop() {
   if (millis() - tempo >= 1000) {
      stato = stato++
      if(stato>9) stato=0;
      *(stampa la variabile prec in nero)*;
      *(stampa la variabile stato in bianco)*;
      prec=stato;
      tempo=millis();
   }
}


Ovviamente le varie stampe sempre nello stesso punto ... cosi in teoria (non posso provare io) dovrebbe continuare a stamparti un numero che cicla da 0 a 9 e poi si ripete, cambiando una volta al secondo ... se va, mi piacerebbe sapere se ti fa ancora i "flash neri", o se si riducono fra un numero e l'altro e diventa piu fluida la variazione fra i diversi numeri ... se va (sto incrociando tutte e 24 le dita :P)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ricki158

Code: [Select]

#define sclk 15
#define mosi 16
#define cs1 4
#define dc1 5
#define rst1 6

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

Adafruit_ST7735 display1 = Adafruit_ST7735(cs1, dc1, rst1);

unsigned long displayTime = millis();

byte Stato = 0;
byte pStato = 0;

void setup() {

  pinMode(sclk, OUTPUT);
  pinMode(mosi, OUTPUT);
  pinMode(cs1, OUTPUT);
  pinMode(dc1, OUTPUT);
  pinMode(rst1, OUTPUT);
 
  display1.initR(INITR_BLACKTAB);
  display1.fillScreen(ST7735_BLACK);

}

void loop() {
 
  if (millis() - displayTime > 1000) {
    Stato = Stato++;
    if (Stato > 9){Stato = 0;}
    display1.setTextColor(ST7735_BLACK);
    display1.setTextSize(3);
    display1.setCursor(50, 65);
    display1.print(Stato);
    display1.setTextColor(ST7735_WHITE);
    display1.print(Stato);
    pStato = Stato;
    displayTime = millis();
  }

}


Cioè così. Carico appena vedo la breadboard prometto!

ricki158

A parte che non si può scrivere
Code: [Select]
Stato = Stato++ il codice funziona, ma non cancella la cifra precedente.

Go Up