Arduino Uno: chi ci gioca? - BaroneRosso.it - Forum Modellismo

Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 19 maggio 17, 12:06   #1 (permalink)  Top
User
 
L'avatar di dex1
 
Data registr.: 19-01-2005
Residenza: 33170 e dintorni
Messaggi: 10.447
Citazione:
Originalmente inviato da aero330 Visualizza messaggio
Ho letto l'articolo, interessante.
In cosa avresti bisogno nello specifico?
la compilazione e successive modifiche del software.
per esempio:
nel progetto ci sono tre varianti,
una lettura
due letture
quattro letture

pero solo su quella a due letture ce il valore minimo e massimo letti
almeno cosi mi sembra.
vorrei in futuro poterla implementare anche sulle altre.

a livello schematico,collegamenti partitori ecc ecc non ho problemi.
__________________
Trattiamo bene la terra su cui viviamo: essa non ci è stata donata dai nostri padri, ma ci è stata prestata dai nostri figli
dex1 non è collegato   Rispondi citando
Vecchio 19 maggio 17, 17:33   #2 (permalink)  Top
User
 
L'avatar di aero330
 
Data registr.: 03-09-2012
Residenza: Gubbio-Ravenna
Messaggi: 1.771
Citazione:
Originalmente inviato da dex1 Visualizza messaggio
la compilazione e successive modifiche del software.
per esempio:
nel progetto ci sono tre varianti,
una lettura
due letture
quattro letture

pero solo su quella a due letture ce il valore minimo e massimo letti
almeno cosi mi sembra.
vorrei in futuro poterla implementare anche sulle altre.

a livello schematico,collegamenti partitori ecc ecc non ho problemi.
Allora:
1) collega la scheda arduino al PC
2) apri l'IDE di arduino, vai su "Strumenti ->Scheda" e selezioni quella che utilizzi
e poi "Strumenti -> Programmatore -> AVRISP mkII"
3) scarica i due file ZIP che ti ho messo in allegato
4) vai su "Strumenti -> Sketch -> #includi libreria -> Aggiungi libreria da file .ZIP"
e cerca i due file "Adafruit_GFX.ZIP" e "Adafruit_ST7735".
5) chiudi tutto e riapri l'IDE di arduino
6) "File -> Nuovo", cancelli tutto e incolli questo:
Codice:
#define sclk 13
#define mosi 11
#define cs   10
#define dc   9
#define rst  8  //  reset

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

// number of analog samples to take per reading, per channel
#define NSAMP 100 // number of samples to take befor displaying

// voltage divider calibration values
#define Dv1    11.00
#define Dv2    11.001
#define Dv3    11.00
#define Dv4    10.985

// ADC reference voltage / calibration value
#define VREF    5.00

int sum[4] = {0};                // sums of samples taken
unsigned char Scount = 0;  // current sample number
float AVvolts[4] = {0.0};        // calculated voltages
char cnt1 = 0;                  // used in 'for' loops

float V_max[4] = {0.00 ,0.00, 0.00, 0.00};
float V_min[4] = {100.00, 100.00, 100.00, 100.00};

void setup()
{
   tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
   tft.fillScreen(ST7735_BLACK); //  clear screen
   tft.setTextColor(ST7735_WHITE);
   tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
   tft.setTextSize(1);
   tft.setCursor(5,0);
   tft.println("4 channel voltmeter");
   tft.setTextColor(0XFF00);
   tft.setCursor(0,140);
   tft.println(" Caution max voltage         55vdc");
}

        
void loop()
{
    // take a number of analog samples and add them up
    while (Scount < NSAMP) {
        // sample each channel A0 to A3
        for (cnt1 = 0; cnt1 < 4; cnt1++) {
            sum[cnt1] += analogRead(A0 + cnt1);
        }
        Scount++;
        delay(10);
    }
    
    // calculate the voltage for each channel
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        AVvolts[cnt1] = ((float)sum[cnt1] / (float)NSAMP * VREF) / 1024.0;
        if(AVvolts[cnt1] > V_max[cnt1]){ //get MAX value of sample
          V_max[cnt1] = AVvolts[cnt1];
        }
        if(AVvolts[cnt1] < V_min[cnt1]){ //get MIN value of sample
          V_min[cnt1] = AVvolts[cnt1];
        }         
    }
    // display voltages on TFT LCC Display
   
    // voltage 1 - V1(pin A0)  
    tft.setTextColor(ST7735_YELLOW,ST7735_BLACK); // set color for V1
    tft.setTextSize(2);
    tft.setCursor(15, 40);
    tft.print("V1 ");
    tft.print(AVvolts[0] * Dv1, 1);
    tft.print("V ");
    // voltage 2 - V2(pin A1)
    tft.setTextColor(ST7735_GREEN,ST7735_BLACK);// set color for V2
    tft.setCursor(15, 60);
    tft.print("V2 ");
    tft.print(AVvolts[1] * Dv2, 1);
    tft.print("V ");
    // voltge 3 - V3(pin A2)
    tft.setTextColor(ST7735_CYAN,ST7735_BLACK);// set color for V3
    tft.setCursor(15, 80);
    tft.print("V3 ");
    tft.print(AVvolts[2] * Dv3, 1);
    tft.print("V ");
    // voltage 4 - V4(pin A3)
    tft.setTextColor(ST7735_WHITE,ST7735_BLACK);// set color for V4
    tft.setCursor(15, 100);
    tft.print("V4 ");
    tft.print(AVvolts[3] * Dv4, 2);
    tft.print("V ");
    tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
    // reset count and sums
    Scount = 0;
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        sum[cnt1] = 0;
    }
}
7)clicca in alto sulla freccia a destra ("carica")
8)se tutto è andato a buon fine non ottieni nessun errore ma solo "caricamento "completato"
9) fatto

Ho preso il codice quello completo con le 4 tensioni lette e aggiunto il calcolo dei valori massimi/minimi per ciascun canale.
L'unica cosa è che non li visualizzi perchè non c'è abbastanza spazio sul display, a meno che tu non mi dica come fare (esempio: visualizzo ogni singolo canale ciclicamente con sotto il max/min relativo, oppure i 4 canali contemporaneamente ma con i valori max/min scrittti a fianco più piccoli ecc ecc)

P.s. non ho il display in questione per cui sto facendo tutto al buio
Files allegati
Tipo file: zip Adafruit_GFX.zip‎ (289,2 KB, 8 visite)
Tipo file: zip Adafruit_ST7735.zip‎ (27,0 KB, 8 visite)
__________________
Divertirsi insieme e con poco? Prova il combat! Curtman Squadron Combat
Sito Web: https://sites.google.com/site/curtmansquadroncombat/

Ultima modifica di aero330 : 19 maggio 17 alle ore 17:38
aero330 non è collegato   Rispondi citando
Vecchio 19 maggio 17, 20:46   #3 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
@andore: per il problema dei disturbi prova a mettere un condensatore in parallelo al motorino, meglio due: un elettrolitico da 22uF..47uF ed un altro ceramico da 10nF, od anche tre, l'elettrolitico e due da 10nF saldati fra i fili di alimentazione del motore e la carcassa dello stesso.

@aero330: per mediare il valore letto dal convertitore AD è meglio usare una media mobile in potenza di 2 lavorando con interi e poi usare lo shift a destra al posto della divisione, solo alla fine fare un unico casting in float che ci sarebbe anche il modo di evitarlo (forse).

Il casting in float, i calcoli in float ed i prinf sono estremamente lenti sui piccoli micro ad 8 bit come quello di arduino 1.

Un altro suggerimento: è buona norma nel assegnare nomi alle variabili usare un prefisso che identifichi il formato della stessa, ad esempio:

- count è meglio chiamarla u8count od u8_count se si usa un intero ad 8 bit senza segno, etc.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 19 maggio 17, 21:27   #4 (permalink)  Top
User
 
L'avatar di aero330
 
Data registr.: 03-09-2012
Residenza: Gubbio-Ravenna
Messaggi: 1.771
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
@andore: per il problema dei disturbi prova a mettere un condensatore in parallelo al motorino, meglio due: un elettrolitico da 22uF..47uF ed un altro ceramico da 10nF, od anche tre, l'elettrolitico e due da 10nF saldati fra i fili di alimentazione del motore e la carcassa dello stesso.

@aero330: per mediare il valore letto dal convertitore AD è meglio usare una media mobile in potenza di 2 lavorando con interi e poi usare lo shift a destra al posto della divisione, solo alla fine fare un unico casting in float che ci sarebbe anche il modo di evitarlo (forse).

Il casting in float, i calcoli in float ed i prinf sono estremamente lenti sui piccoli micro ad 8 bit come quello di arduino 1.

Un altro suggerimento: è buona norma nel assegnare nomi alle variabili usare un prefisso che identifichi il formato della stessa, ad esempio:

- count è meglio chiamarla u8count od u8_count se si usa un intero ad 8 bit senza segno, etc.

Tutti giusto, non fa una piega.
Per quel poco di programmazione che mi hanno fatto vedere durante gli studi il fatto di nominare le variabili u8cnt, u16cnt proprio non l'avevo mai sentita.
In un codice semplice potrebbe anche andare ma in in listato lungo e complesso non potrebbe disorientare??
__________________
Divertirsi insieme e con poco? Prova il combat! Curtman Squadron Combat
Sito Web: https://sites.google.com/site/curtmansquadroncombat/
aero330 non è collegato   Rispondi citando
Vecchio 20 maggio 17, 12:57   #5 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Thumbs up

Citazione:
Originalmente inviato da aero330 Visualizza messaggio
Tutti giusto, non fa una piega.
Per quel poco di programmazione che mi hanno fatto vedere durante gli studi il fatto di nominare le variabili u8cnt, u16cnt proprio non l'avevo mai sentita.
In un codice semplice potrebbe anche andare ma in in listato lungo e complesso non potrebbe disorientare??
Invece è prprio nel listato lungo che serve, perchè così ti ricordi l'ordine di grandezza ed il tipo di variabile, specialmente quando il compilatore da dei warning, ad esempio può capitare di scambiare anche una variabile puntatore con una normale.

Un altro aspetto da considerare per scrivere un buon codice è non infarcire di righe il loop di programma inserendo li il codice stesso, molto meglio creare funzioni e chiamarle dal loop principale, ad esempio nel programmino per dex:

Loop
LeggiADC();
Media(ADC);
DisplayData();
end loop


Questo consente di avere una visone chiara delle funzioni del programma di isolare più facilmente i bugs e di ottimizzare le funzioni chiamate in maniera autonoma.

Se interessa potrei suggerire anche un sistema RTOS molto semplice ma assai efficace per scrivere programmi puliti e veloci.

A chi interessato consiglierei di scaricarsi dalla rete il manuale del "MISRA C" sono le indicazioni per scrivere codice sicuro e testabile alle quali bisognerebbe attenersi se si lavora in automotive, ferroviario, marino etc. non è specialistico ma insegna molto ed è estremamente utile.

Usare buone regole di scrittura è assai utile quando si deve riprendere in mano un programma dopo 10 anni...

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 20 maggio 17, 13:13   #6 (permalink)  Top
User
 
L'avatar di andycar
 
Data registr.: 20-01-2006
Residenza: Altopascio
Messaggi: 2.370
Immagini: 20
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Invece è prprio nel listato lungo che serve, perchè così ti ricordi l'ordine di grandezza ed il tipo di variabile, specialmente quando il compilatore da dei warning, ad esempio può capitare di scambiare anche una variabile puntatore con una normale.

Un altro aspetto da considerare per scrivere un buon codice è non infarcire di righe il loop di programma inserendo li il codice stesso, molto meglio creare funzioni e chiamarle dal loop principale, ad esempio nel programmino per dex:

Loop
LeggiADC();
Media(ADC);
DisplayData();
end loop


Questo consente di avere una visone chiara delle funzioni del programma di isolare più facilmente i bugs e di ottimizzare le funzioni chiamate in maniera autonoma.

Se interessa potrei suggerire anche un sistema RTOS molto semplice ma assai efficace per scrivere programmi puliti e veloci.

A chi interessato consiglierei di scaricarsi dalla rete il manuale del "MISRA C" sono le indicazioni per scrivere codice sicuro e testabile alle quali bisognerebbe attenersi se si lavora in automotive, ferroviario, marino etc. non è specialistico ma insegna molto ed è estremamente utile.

Usare buone regole di scrittura è assai utile quando si deve riprendere in mano un programma dopo 10 anni...

Quoto ogni singolo pixel...
__________________
Io???
Io volo in giardino!!! (Cioè... ci volavo da giovane.)
http://www.youtube.com/results?searc...ype=&aq=-1&oq=
andycar non è collegato   Rispondi citando
Vecchio 20 maggio 17, 20:40   #7 (permalink)  Top
User
 
L'avatar di aero330
 
Data registr.: 03-09-2012
Residenza: Gubbio-Ravenna
Messaggi: 1.771
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Invece è prprio nel listato lungo che serve, perchè così ti ricordi l'ordine di grandezza ed il tipo di variabile, specialmente quando il compilatore da dei warning, ad esempio può capitare di scambiare anche una variabile puntatore con una normale.

Un altro aspetto da considerare per scrivere un buon codice è non infarcire di righe il loop di programma inserendo li il codice stesso, molto meglio creare funzioni e chiamarle dal loop principale, ad esempio nel programmino per dex:

Loop
LeggiADC();
Media(ADC);
DisplayData();
end loop


Questo consente di avere una visone chiara delle funzioni del programma di isolare più facilmente i bugs e di ottimizzare le funzioni chiamate in maniera autonoma.

Se interessa potrei suggerire anche un sistema RTOS molto semplice ma assai efficace per scrivere programmi puliti e veloci.

A chi interessato consiglierei di scaricarsi dalla rete il manuale del "MISRA C" sono le indicazioni per scrivere codice sicuro e testabile alle quali bisognerebbe attenersi se si lavora in automotive, ferroviario, marino etc. non è specialistico ma insegna molto ed è estremamente utile.

Usare buone regole di scrittura è assai utile quando si deve riprendere in mano un programma dopo 10 anni...

Concordo pure io, ma per un principiante alle prime armi con queste cose non è meglio magari lasciare le cose più "semplici"? Del resto parliamo di codici ancora abbstanza "snelli" anche ss quello e dici è giusto e lecito se si vuole ottimizzare al massimo e fare le cose con criterio
__________________
Divertirsi insieme e con poco? Prova il combat! Curtman Squadron Combat
Sito Web: https://sites.google.com/site/curtmansquadroncombat/
aero330 non è collegato   Rispondi citando
Vecchio 20 maggio 17, 21:04   #8 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Citazione:
Originalmente inviato da aero330 Visualizza messaggio
Concordo pure io, ma per un principiante alle prime armi con queste cose non è meglio magari lasciare le cose più "semplici"? Del resto parliamo di codici ancora abbstanza "snelli" anche ss quello e dici è giusto e lecito se si vuole ottimizzare al massimo e fare le cose con criterio
mhhhh: "dai ad un uomo un pesce e lo sfami per un giorno, insegnali a pescare e lo sfamerai per la vita"

Aforismi a parte, se si inizia da subito ad essere precisi, metodici ed ordinati nella scrittura del codice quando sorgeranno difficoltà maggiori si avranno i mezzi e le conoscenze per superarle in autonomia; la grammatica e le lingue è bene impararle da piccoli se no poi si fa fatica.

Ad esempio se dal main loop chiamo la funzione CalcAdc ed oggi la funzione è scritta come la tua ma domani decido di implementare la media mobile e un singolo cast, mi basterebbe lavorare sulla funzione e non sul main, cosa assai più facile.

Per esperienza so che le richieste delle funzioni di un programma sono come le ciliege, tutti mangiano la prima ma poi si ingurgitano tutto cesto.... quindi i programmi sono destinati a crescere quasi all'infinito ed a complicarsi in poco tempo, pertanto meglio cominciare bene.

IMHO

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 22 maggio 17, 18:05   #9 (permalink)  Top
User
 
L'avatar di dex1
 
Data registr.: 19-01-2005
Residenza: 33170 e dintorni
Messaggi: 10.447
Citazione:
Originalmente inviato da aero330 Visualizza messaggio
Allora:
1) collega la scheda arduino al PC
2) apri l'IDE di arduino, vai su "Strumenti ->Scheda" e selezioni quella che utilizzi
e poi "Strumenti -> Programmatore -> AVRISP mkII"
3) scarica i due file ZIP che ti ho messo in allegato
4) vai su "Strumenti -> Sketch -> #includi libreria -> Aggiungi libreria da file .ZIP"
e cerca i due file "Adafruit_GFX.ZIP" e "Adafruit_ST7735".
5) chiudi tutto e riapri l'IDE di arduino
6) "File -> Nuovo", cancelli tutto e incolli questo:
Codice:
#define sclk 13
#define mosi 11
#define cs   10
#define dc   9
#define rst  8  //  reset

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

// number of analog samples to take per reading, per channel
#define NSAMP 100 // number of samples to take befor displaying

// voltage divider calibration values
#define Dv1    11.00
#define Dv2    11.001
#define Dv3    11.00
#define Dv4    10.985

// ADC reference voltage / calibration value
#define VREF    5.00

int sum[4] = {0};                // sums of samples taken
unsigned char Scount = 0;  // current sample number
float AVvolts[4] = {0.0};        // calculated voltages
char cnt1 = 0;                  // used in 'for' loops

float V_max[4] = {0.00 ,0.00, 0.00, 0.00};
float V_min[4] = {100.00, 100.00, 100.00, 100.00};

void setup()
{
   tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
   tft.fillScreen(ST7735_BLACK); //  clear screen
   tft.setTextColor(ST7735_WHITE);
   tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
   tft.setTextSize(1);
   tft.setCursor(5,0);
   tft.println("4 channel voltmeter");
   tft.setTextColor(0XFF00);
   tft.setCursor(0,140);
   tft.println(" Caution max voltage         55vdc");
}

        
void loop()
{
    // take a number of analog samples and add them up
    while (Scount < NSAMP) {
        // sample each channel A0 to A3
        for (cnt1 = 0; cnt1 < 4; cnt1++) {
            sum[cnt1] += analogRead(A0 + cnt1);
        }
        Scount++;
        delay(10);
    }
    
    // calculate the voltage for each channel
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        AVvolts[cnt1] = ((float)sum[cnt1] / (float)NSAMP * VREF) / 1024.0;
        if(AVvolts[cnt1] > V_max[cnt1]){ //get MAX value of sample
          V_max[cnt1] = AVvolts[cnt1];
        }
        if(AVvolts[cnt1] < V_min[cnt1]){ //get MIN value of sample
          V_min[cnt1] = AVvolts[cnt1];
        }         
    }
    // display voltages on TFT LCC Display
   
    // voltage 1 - V1(pin A0)  
    tft.setTextColor(ST7735_YELLOW,ST7735_BLACK); // set color for V1
    tft.setTextSize(2);
    tft.setCursor(15, 40);
    tft.print("V1 ");
    tft.print(AVvolts[0] * Dv1, 1);
    tft.print("V ");
    // voltage 2 - V2(pin A1)
    tft.setTextColor(ST7735_GREEN,ST7735_BLACK);// set color for V2
    tft.setCursor(15, 60);
    tft.print("V2 ");
    tft.print(AVvolts[1] * Dv2, 1);
    tft.print("V ");
    // voltge 3 - V3(pin A2)
    tft.setTextColor(ST7735_CYAN,ST7735_BLACK);// set color for V3
    tft.setCursor(15, 80);
    tft.print("V3 ");
    tft.print(AVvolts[2] * Dv3, 1);
    tft.print("V ");
    // voltage 4 - V4(pin A3)
    tft.setTextColor(ST7735_WHITE,ST7735_BLACK);// set color for V4
    tft.setCursor(15, 100);
    tft.print("V4 ");
    tft.print(AVvolts[3] * Dv4, 2);
    tft.print("V ");
    tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
    // reset count and sums
    Scount = 0;
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        sum[cnt1] = 0;
    }
}
7)clicca in alto sulla freccia a destra ("carica")
8)se tutto è andato a buon fine non ottieni nessun errore ma solo "caricamento "completato"
9) fatto

Ho preso il codice quello completo con le 4 tensioni lette e aggiunto il calcolo dei valori massimi/minimi per ciascun canale.
L'unica cosa è che non li visualizzi perchè non c'è abbastanza spazio sul display, a meno che tu non mi dica come fare (esempio: visualizzo ogni singolo canale ciclicamente con sotto il max/min relativo, oppure i 4 canali contemporaneamente ma con i valori max/min scrittti a fianco più piccoli ecc ecc)

P.s. non ho il display in questione per cui sto facendo tutto al buio


grazie,
appena mi arrivano i display mi metto a sperimentare.
__________________
Trattiamo bene la terra su cui viviamo: essa non ci è stata donata dai nostri padri, ma ci è stata prestata dai nostri figli
dex1 non è collegato   Rispondi citando
Vecchio 23 maggio 17, 15:54   #10 (permalink)  Top
User
 
L'avatar di dex1
 
Data registr.: 19-01-2005
Residenza: 33170 e dintorni
Messaggi: 10.447
Citazione:
Originalmente inviato da aero330 Visualizza messaggio
Allora:
1) collega la scheda arduino al PC
2) apri l'IDE di arduino, vai su "Strumenti ->Scheda" e selezioni quella che utilizzi
e poi "Strumenti -> Programmatore -> AVRISP mkII"
3) scarica i due file ZIP che ti ho messo in allegato
4) vai su "Strumenti -> Sketch -> #includi libreria -> Aggiungi libreria da file .ZIP"
e cerca i due file "Adafruit_GFX.ZIP" e "Adafruit_ST7735".
5) chiudi tutto e riapri l'IDE di arduino
6) "File -> Nuovo", cancelli tutto e incolli questo:
Codice:
#define sclk 13
#define mosi 11
#define cs   10
#define dc   9
#define rst  8  //  reset

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

// number of analog samples to take per reading, per channel
#define NSAMP 100 // number of samples to take befor displaying

// voltage divider calibration values
#define Dv1    11.00
#define Dv2    11.001
#define Dv3    11.00
#define Dv4    10.985

// ADC reference voltage / calibration value
#define VREF    5.00

int sum[4] = {0};                // sums of samples taken
unsigned char Scount = 0;  // current sample number
float AVvolts[4] = {0.0};        // calculated voltages
char cnt1 = 0;                  // used in 'for' loops

float V_max[4] = {0.00 ,0.00, 0.00, 0.00};
float V_min[4] = {100.00, 100.00, 100.00, 100.00};

void setup()
{
   tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
   tft.fillScreen(ST7735_BLACK); //  clear screen
   tft.setTextColor(ST7735_WHITE);
   tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
   tft.setTextSize(1);
   tft.setCursor(5,0);
   tft.println("4 channel voltmeter");
   tft.setTextColor(0XFF00);
   tft.setCursor(0,140);
   tft.println(" Caution max voltage         55vdc");
}

        
void loop()
{
    // take a number of analog samples and add them up
    while (Scount < NSAMP) {
        // sample each channel A0 to A3
        for (cnt1 = 0; cnt1 < 4; cnt1++) {
            sum[cnt1] += analogRead(A0 + cnt1);
        }
        Scount++;
        delay(10);
    }
    
    // calculate the voltage for each channel
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        AVvolts[cnt1] = ((float)sum[cnt1] / (float)NSAMP * VREF) / 1024.0;
        if(AVvolts[cnt1] > V_max[cnt1]){ //get MAX value of sample
          V_max[cnt1] = AVvolts[cnt1];
        }
        if(AVvolts[cnt1] < V_min[cnt1]){ //get MIN value of sample
          V_min[cnt1] = AVvolts[cnt1];
        }         
    }
    // display voltages on TFT LCC Display
   
    // voltage 1 - V1(pin A0)  
    tft.setTextColor(ST7735_YELLOW,ST7735_BLACK); // set color for V1
    tft.setTextSize(2);
    tft.setCursor(15, 40);
    tft.print("V1 ");
    tft.print(AVvolts[0] * Dv1, 1);
    tft.print("V ");
    // voltage 2 - V2(pin A1)
    tft.setTextColor(ST7735_GREEN,ST7735_BLACK);// set color for V2
    tft.setCursor(15, 60);
    tft.print("V2 ");
    tft.print(AVvolts[1] * Dv2, 1);
    tft.print("V ");
    // voltge 3 - V3(pin A2)
    tft.setTextColor(ST7735_CYAN,ST7735_BLACK);// set color for V3
    tft.setCursor(15, 80);
    tft.print("V3 ");
    tft.print(AVvolts[2] * Dv3, 1);
    tft.print("V ");
    // voltage 4 - V4(pin A3)
    tft.setTextColor(ST7735_WHITE,ST7735_BLACK);// set color for V4
    tft.setCursor(15, 100);
    tft.print("V4 ");
    tft.print(AVvolts[3] * Dv4, 2);
    tft.print("V ");
    tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
    // reset count and sums
    Scount = 0;
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        sum[cnt1] = 0;
    }
}
7)clicca in alto sulla freccia a destra ("carica")
8)se tutto è andato a buon fine non ottieni nessun errore ma solo "caricamento "completato"
9) fatto

Ho preso il codice quello completo con le 4 tensioni lette e aggiunto il calcolo dei valori massimi/minimi per ciascun canale.
L'unica cosa è che non li visualizzi perchè non c'è abbastanza spazio sul display, a meno che tu non mi dica come fare (esempio: visualizzo ogni singolo canale ciclicamente con sotto il max/min relativo, oppure i 4 canali contemporaneamente ma con i valori max/min scrittti a fianco più piccoli ecc ecc)

P.s. non ho il display in questione per cui sto facendo tutto al buio
Citazione:
Originalmente inviato da dex1 Visualizza messaggio


grazie,
appena mi arrivano i display mi metto a sperimentare.
fatto,e ho più o meno capito come fare,pero preferisco lo sketc a due tensioni.
ho gia capito come cambiare i colori delle varie scritte,ma non come mettere i valori medi.
un grazie e poco.
ciao
__________________
Trattiamo bene la terra su cui viviamo: essa non ci è stata donata dai nostri padri, ma ci è stata prestata dai nostri figli
dex1 non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
arduino uno e ..... FLYTS Circuiti Elettronici 3 23 settembre 14 14:50



Tutti gli orari sono GMT +2. Adesso sono le 07:52.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002