Se sei già registrato           oppure    

Orario: 30/01/2023 02:04:17  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

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


Convertitore a ADC 16Bit ADS1115 su Arduino
FinePagina

Bolle

Avatar
GigaWatt


Gruppo:AMMINISTRATORE
Messaggi:7809

Stato:



Inviato il: 23/11/2018 11:40:55

Va benissimo...è solo un po lento rispetto al ads1115



---------------
Un risultato se non è ripetibile non esiste (by qqcreafis).

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 11/05/2019 13:24:21

CITAZIONE (Bolle, 16/01/2017 18:21:01 ) Discussione.php?214354&1#MSG0

Vediamo come si interfaccia un convertitore a 16 bit sul nostro arduino.
Questo dispositivo, cioè l'ADS1115, ha anche una preamplificazione settabile a livello SW:



CITAZIONE

Gain 2/3 : VMAX +/-6.144V
Gain 1 : VMAX +/-4.096V
Gain 2 : VMAX +/-2.048V
Gain 4 : VMAX +/-1.024V
Gain 8 : VMAX +/-0.512V
Gain 16 : VMAX +/-0.256V


Questi sono i collegamenti :

http://www.energialternativa.info/public/newforum/ForumEA/P/ads1115PerArduino.jpg



cioè occorre collegare la schedina
Schedina = Arduino
Vdd = +5V
GND = GND
SDA = A4
SCL = A5

Questo convertitore ha la possibbilità di interrogare 4 ingressi mediante un multiplexer sempre gestito a livello SW.

Il protocollo con cui comunica con l'arduino è I2C ed è per quello che occorre collegare SDA e SCL.

Il codice di test è questo...ho dovuto mettere i doppi apici sull'include wire.h altrimenti non compilava.


#include "Wire.h"
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;  

void setup(void) 
{
  Serial.begin(9600);
 
  ads.setGain(GAIN_TWOTHIRDS);     // 2/3x gain   +/-6.144V
  // ads.setGain(GAIN_ONE);        // 1x gain   +/-4.096V  
  // ads.setGain(GAIN_TWO);        // 2x gain   +/-2.048V 
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/-1.024V  
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/-0.512V 
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/-0.256V 
  
  ads.begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3;

  adc0 = ads.readADC_SingleEnded(0);
  Serial.print("CHANNEL 0: ");
  Serial.println(adc0);
  delay(300);
}




ma lads1115 misura tramite resistenze ?



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 12/05/2019 08:57:44

Vuoi dire aggiuntive? No, colleghi il modulo alla porta I2C, lo alimenti ed è pronto a leggere gli ingressi analogici



---------------
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.

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 12/05/2019 09:09:57

CITAZIONE (calcola, 12/05/2019 08:57:44 ) Discussione.php?214354&2#MSG17

Vuoi dire aggiuntive? No, colleghi il modulo alla porta I2C, lo alimenti ed è pronto a leggere gli ingressi analogici



vorrei leggere la tensione dei miei pannelli massimo 38v

devo mettere partitore di tensione , quanto e massimo il valore che leggono ?

e leggere i segnali provenienti da gli acs da 30A A 100 A



grazie



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 12/05/2019 21:37:25

Quale scheda intendi usare, Arduino, esp8266...



Modificato da calcola - 12/05/2019, 21:42:40


---------------
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.

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 12/05/2019 21:46:31

CITAZIONE (calcola, 12/05/2019 21:37:25 ) Discussione.php?214354&2#MSG19

Quale scheda intendi usare, Arduino, esp8266...

Sto già usando Arduino mega , con 4 sensori ACS
3 tensioni pannelli
2 bs da 12v ,
Al momento li vedo online con blynk , e su 2 display a 4 righe



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 12/05/2019 21:53:25

questo e il mio schetch , ci sono riuscito a forza di copia incolla dal web ed e molto incasinato

#include

#include

Adafruit_ADS1115 ads; /* Use this for the 16-bit version */


// COMANDO https://youtu.be/bWvOlyGAD-g

// parte del codice e opera di BOB

// comando uscite blynk https://youtu.be/WcFDtBe8pY4

// https://www.youtube.com/watch?v=bWvOlyGAD-g&feature=youtu.be
// https://youtu.be/bWvOlyGAD-g
// https://youtu.be/YRomluFylXQ

#define BLYNK_PRINT Serial


#include
#include
#include

#include


// camper mega 2 char auth[] = "0df85fb625db655";

char auth[] = "17132af5a9c7";

#define W5100_CS 10
#define SDCARD_CS 4


//blynk DISPLAY

#define bsamp V15 // amper BS
#define bsvolt V14 // volt BS

#define solamp V13 //
#define solvolt V12 //

#define solamp2 V11 //
#define solvolt2 V10 //

#define solamp3 V9 //
#define solvolt3 V8 //


#define bmvolt V7 //

// blynk



// Set the LCD address to 0x27 for a 16 chars and 2 line display



LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x23, 20, 4);






//const int TENSIONE_BS = A14;


const int AMP_BS = A15;



const int AMP_SOL = A14;
const int AMP_SOL2 = A13;
const int AMP_SOL3 = A12;


//const int TENSIONE_BS = adc0;
const int TENSIONE_BS = A0;
const int TENSIONE_SOL = A1;
const int TENSIONE_SOL2 = A2;
const int TENSIONE_SOL3 = A3;
const int TENSIONE_BM = A4;




double tensioneBS = 0; // valore dove leggerò tensione BS

double tensioneSOL = 0; // valore dove leggerò tensione BS
double tensioneSOL2 = 0; // valore dove leggerò tensione BS
double tensioneSOL3 = 0; // valore dove leggerò tensione BS
double tensioneBM = 0; // valore dove leggerò tensione BM

//CORRENTE
double correnteBS = 0; // valore dove leggerò corrente BS

double correnteSOL = 0; // valore dove leggerò corrente BS

double correnteSOL2 = 0; // valore dove leggerò corrente BS
double correnteSOL3 = 0; // valore dove leggerò corrente BS

// CORRENTE


const double R1 = 10000.0;
const double R2 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensione = (R1 + R2) / R2;


const double R3 = 10000.0;
const double R4 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionesol = (R3 + R4) / R4;

const double R5 = 10000.0;
const double R6 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionesol2 = (R5 + R6) / R6;


const double R7 = 10000.0;
const double R8 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionesol3 = (R7 + R8) / R8;


const double R9 = 10000.0;
const double R10 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionebm = (R9 + R10) / R10;

BlynkTimer timer;



void setup() {

//comando blynk

pinMode(A5,INPUT);
pinMode(A6,INPUT);
pinMode(A7,INPUT);
pinMode(A8,INPUT);


timer.setInterval(300L, leggibt);





// put your setup code here, to run once:
Serial.begin(9600); //per la comunicazione seriale

Serial.println("Hello!");

Serial.println("Getting single-ended readings from AIN0..3");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");

// The ADC input range (or gain) can be changed via the following
// functions, but be careful never to exceed VDD +0.3V max, or to
// exceed the upper and lower limits if you adjust the input range!
// Setting these values incorrectly may destroy your ADC!
// ADS1015 ADS1115
// ------- -------
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV

ads.begin();






pinMode(SDCARD_CS, OUTPUT);
digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card

Blynk.begin(auth);
//timer.setInterval(500L, leggidati);











lcd.begin(); //inizializzazione lcd 16x2
lcd2.begin(); //inizializzazione lcd 16x2



//TENSIONE
pinMode (TENSIONE_BS, INPUT);
pinMode (TENSIONE_SOL, INPUT);
pinMode (TENSIONE_SOL2, INPUT);
pinMode (TENSIONE_SOL3, INPUT);
pinMode (TENSIONE_BM, INPUT);




//TEBNSIONE


pinMode (AMP_BS, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL2, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL3, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
//pinMode (adc0,INPUT);
}









void loop() {

int16_t adc0, adc1, adc2, adc3;

adc0 = ads.readADC_SingleEnded(0);
adc1 = ads.readADC_SingleEnded(1);
adc2 = ads.readADC_SingleEnded(2);
adc3 = ads.readADC_SingleEnded(3);
Serial.print("AIN0: "); Serial.println(adc0);
Serial.print("AIN1: "); Serial.println(adc1);
Serial.print("AIN2: "); Serial.println(adc2);
Serial.print("AIN3: "); Serial.println(adc3);
Serial.println(" ");

Blynk.run();
timer.run();


// AMPEROMETRO
double letturaTensioneInVolt;

letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);


double letturaTensioneInVoltsol;

letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);


double letturaTensioneInVoltsol2;

letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);

double letturaTensioneInVoltsol3;

letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);






//Serial.print(analogRead(AMP_BS) );
//Serial.print( " " );
//Serial.println(letturaTensioneInVolt, 2);

//(tra parentesi, lascia perdere i float, usa i double -- se vuoi ti spiego perché, altrimenti fidati e basta :-)

// a questo punto, applichiamo la conversione: per ACS 100 sono 20mV/A
// quindi
//correnteLetta = (2.5 - letturaTensioneInVolt ) * 1000 / 20;
// moltiplico per 1000 per ottenere la lettura in millivolt, e divido per 20.
// Dato che è 1000/20 è costante semplifico:

double correnteLetta = (2.2999 - letturaTensioneInVolt ) * 50.0; // bs amp
double correnteLettasol = (2.5000 - letturaTensioneInVoltsol ) * 50.0;

double correnteLettasol2 = (2.5000 - letturaTensioneInVoltsol2 ) * 50.0;
double correnteLettasol3 = (2.5000 - letturaTensioneInVoltsol3 ) * 50.0;


//nota: scrivo 50.0 per abitudine, perché in alcune circostanze il compilatore potrebbbe fare divisione fra interi

// adesso il problema è che quel 2.5 è lo zero dell'amperometro.
// con adeguata precisione, potresti usare un piccolo correttivo
// (ad esempio, da un mio schema reale leggo 2.4754)
// nel tuo caso, ti direi di pensarci in futuro, quando avrai ADS1115 per leggere tensioni


// altro punto: la media delle 5 letture significa che devi leggere 5 volte la corrente, soomarla e fare la media.
//quindi:

double sommaTemporanea = correnteLetta;

for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLetta = (2.5 - letturaTensioneInVolt ) * -50.0;
letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);

sommaTemporanea = sommaTemporanea + correnteLetta;
}

correnteBS = sommaTemporanea / 5.0;



double sommaTemporaneasol = correnteLettasol;

for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol = (2.5 - letturaTensioneInVoltsol ) * -50.0;
letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);

sommaTemporaneasol = sommaTemporaneasol + correnteLettasol;
}

correnteSOL = sommaTemporaneasol / 5.0;




double sommaTemporaneasol2 = correnteLettasol2;

for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol2 = (2.5 - letturaTensioneInVoltsol2 ) * -50.0;
letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);

sommaTemporaneasol2 = sommaTemporaneasol2 + correnteLettasol2;
}

correnteSOL2 = sommaTemporaneasol2 / 5.0;




double sommaTemporaneasol3 = correnteLettasol3;

for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol3 = (2.5 - letturaTensioneInVoltsol3 ) * -50.0;
letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);

sommaTemporaneasol3 = sommaTemporaneasol3 + correnteLettasol3;
}

correnteSOL3 = sommaTemporaneasol3 / 5.0;











// SECONDA PARTE

// la lettura BS diventa
// double tensioneCorretta = tensioneAlPartitore * partitoreTensione ;
// quindi



tensioneBS = (5.0 / 1024 * analogRead(TENSIONE_BS)) * partitoreTensione ;
tensioneSOL = (5.0 / 1024 * analogRead(TENSIONE_SOL)) * partitoreTensionesol ;
tensioneSOL2 = (5.0 / 1024 * analogRead(TENSIONE_SOL2)) * partitoreTensionesol2 ;
tensioneSOL3 = (5.0 / 1024 * analogRead(TENSIONE_SOL3)) * partitoreTensionesol3 ;
tensioneBM = (5.0 / 1024 * analogRead(TENSIONE_BM)) * partitoreTensionebm ;


// STAMPA LCD
lcd.clear(); //pulisci lcd
lcd.setCursor(0, 0); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneBS, 1);
lcd.print(" BS A ");
lcd.print(correnteBS, 1);



lcd.setCursor(0, 1); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL, 1);
lcd.print(" SOL A ");
lcd.print(correnteSOL, 1);

lcd.setCursor(0, 2); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL2, 1);
lcd.print(" SOL2 A ");
lcd.print(correnteSOL2, 1);

lcd.setCursor(0, 3); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL3, 1);
lcd.print(" SOL3 A ");
lcd.print(correnteSOL3, 1);
//lcd.print(adc0, 1);




// 2 LCD

lcd2.clear(); //pulisci lcd
lcd2.setCursor(0, 0); //posiziona il cursore sulla prima linea del display
lcd2.print("V ");
lcd2.print (tensioneBS, 1);
lcd2.print(" A BS ");
lcd2.print(correnteBS, 1);

//pulisci lcd
lcd2.setCursor(0, 1); //posiziona il cursore sulla prima linea del display
lcd2.print("V BM ");
lcd2.print (tensioneBM, 1);



// ********************* DA BOB -- FINE INTERVENTO

delay(250);
//delay(250);

Blynk.run();
timer.run();
}

//void leggidati()




BLYNK_READ(bsamp) //1 amp


{
Blynk.virtualWrite(bsamp, correnteBS);


}






BLYNK_READ(bsvolt) //1 amp


{
Blynk.virtualWrite(bsvolt, tensioneBS);


}





BLYNK_READ(solamp) //1 amp


{
Blynk.virtualWrite(solamp, correnteSOL);


}


BLYNK_READ(solvolt) //1 amp


{
Blynk.virtualWrite(solvolt, tensioneSOL);


}




//2


BLYNK_READ(solamp2) //1 amp


{
Blynk.virtualWrite(solamp2, correnteSOL2);


}


BLYNK_READ(solvolt2) //1 amp


{
Blynk.virtualWrite(solvolt2, tensioneSOL2);


}

BLYNK_READ(solamp3) //1 amp


{
Blynk.virtualWrite(solamp3, correnteSOL3);


}





BLYNK_READ(solvolt3) //1 amp


{
Blynk.virtualWrite(solvolt3, tensioneSOL3);


}

BLYNK_READ(bmvolt) //1 amp


{
Blynk.virtualWrite(bmvolt, tensioneBM);


}

void leggibt()


{
if (digitalRead(A5)){
Blynk.virtualWrite(V5, 255);
} else {
Blynk.virtualWrite(V5, 0);
}


if (digitalRead(A6)){
Blynk.virtualWrite(V6, 255);
} else {
Blynk.virtualWrite(V6, 0);
}

if (digitalRead(A7)){
Blynk.virtualWrite(V4, 255);
} else {
Blynk.virtualWrite(V4, 0);
}

if (digitalRead(A8)){
Blynk.virtualWrite(V3, 255);
} else {
Blynk.virtualWrite(V3, 0);
}




}



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 12/05/2019 21:57:43

questo e quello che vedo sul cellulare tramite internet



Immagine Allegata: Screenshot_20190512-215047.jpg
 
ForumEA/U/Screenshot_20190512-215047.jpg



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 12/05/2019 21:58:06

2



Immagine Allegata: Screenshot_20190512-215058.jpg
 
ForumEA/U/Screenshot_20190512-215058.jpg



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 12/05/2019 21:58:30

3



Immagine Allegata: Screenshot_20190512-215106.jpg
 
ForumEA/U/Screenshot_20190512-215106.jpg



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 12/05/2019 22:13:09

Se usi un arduino mega o anche un arduino uno, l'acs1115 non ti serve, la scheda ha già tutte le porte analogiche che ti servono. L'espansione è necessaria quando non vi sono le porte analogiche o per applicazioni particolari.



---------------
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.

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 12/05/2019 22:34:46

CITAZIONE (calcola, 12/05/2019 22:13:09 ) Discussione.php?214354&2#MSG25

Se usi un arduino mega o anche un arduino uno, l'acs1115 non ti serve, la scheda ha già tutte le porte analogiche che ti servono. L'espansione è necessaria quando non vi sono le porte analogiche o per applicazioni particolari.



un amico me lo consigliava per avere una lettura piu precisa .....



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 13/05/2019 04:25:45

Appunto, è utile per scopi particolari dove la lettura al millesimo fa la differenza, non è il tuo caso. Per leggere la tensione dei pannelli il primo decimale è già sufficiente e lo stesso per la corrente, dove la precisione dipende dall'acs e non è che sia molto preciso.

Il codice per l'arduino devi postarlo con un copia incolla dentro il tag code, quindi prima selezioni il pulsante "code" sul menu' di sinistra e dentro il tag incolli il codice.



Modificato da calcola - 13/05/2019, 04:31:43


---------------
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.

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 13/05/2019 07:15:50

#include <Adafruit_ADS1015.h>

#include <Blynk.h>

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */


//    COMANDO    https://youtu.be/bWvOlyGAD-g

//   parte del codice  e opera di BOB

// comando uscite blynk https://youtu.be/WcFDtBe8pY4

//  https://www.youtube.com/watch?v=bWvOlyGAD-g&feature=youtu.be
//   https://youtu.be/bWvOlyGAD-g
//  https://youtu.be/YRomluFylXQ

#define BLYNK_PRINT Serial


#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>

#include <LiquidCrystal_I2C.h>


  // camper mega 2  char auth[] = "7e625db655";

 char auth[] = "ed32af5a9c7";

#define W5100_CS  10
#define SDCARD_CS 4


//blynk DISPLAY

#define bsamp  V15  // amper  BS
#define bsvolt  V14  // volt  BS

#define solamp  V13  // 
#define solvolt  V12  // 

#define solamp2  V11  // 
#define solvolt2  V10  // 

#define solamp3  V9  // 
#define solvolt3  V8  // 


#define bmvolt  V7  // 

//  blynk



// Set the LCD address to 0x27 for a 16 chars and 2 line display



LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x23, 20, 4);






//const int  TENSIONE_BS = A14;


const int  AMP_BS = A15;           



const int  AMP_SOL = A14;
const int  AMP_SOL2 = A13;
const int  AMP_SOL3 = A12;


//const int  TENSIONE_BS = adc0;
const int  TENSIONE_BS = A0;
const int  TENSIONE_SOL = A1;
const int  TENSIONE_SOL2 = A2;
const int  TENSIONE_SOL3 = A3;
const int  TENSIONE_BM = A4;




double tensioneBS = 0; // valore dove leggerò tensione BS

double tensioneSOL = 0; // valore dove leggerò tensione BS
double tensioneSOL2 = 0; // valore dove leggerò tensione BS
double tensioneSOL3 = 0; // valore dove leggerò tensione BS
double tensioneBM = 0; // valore dove leggerò tensione BM

//CORRENTE
double correnteBS = 0; // valore dove leggerò corrente BS

double correnteSOL = 0; // valore dove leggerò corrente BS

double correnteSOL2 = 0; // valore dove leggerò corrente BS
double correnteSOL3 = 0; // valore dove leggerò corrente BS

// CORRENTE


const double R1 = 10000.0;
const double R2 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensione = (R1 + R2) / R2;


const double R3 = 10000.0;
const double R4 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionesol = (R3 + R4) / R4;

const double R5 = 10000.0;
const double R6 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionesol2 = (R5 + R6) / R6;


const double R7 = 10000.0;
const double R8 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionesol3 = (R7 + R8) / R8;


const double R9 = 10000.0;
const double R10 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm

const double partitoreTensionebm = (R9 + R10) / R10;

BlynkTimer timer;



void setup() {

//comando blynk

pinMode(A5,INPUT);
pinMode(A6,INPUT);
pinMode(A7,INPUT);
pinMode(A8,INPUT);


timer.setInterval(300L, leggibt);




  
  // put your setup code here, to run once:
  Serial.begin(9600);       //per la comunicazione seriale

Serial.println("Hello!");

Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
  
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads.begin();






pinMode(SDCARD_CS, OUTPUT);
  digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card

  Blynk.begin(auth);
//timer.setInterval(500L, leggidati);
  










  lcd.begin();        //inizializzazione lcd 16x2
lcd2.begin();        //inizializzazione lcd 16x2



//TENSIONE
  pinMode (TENSIONE_BS, INPUT);
pinMode (TENSIONE_SOL, INPUT);
pinMode (TENSIONE_SOL2, INPUT);
pinMode (TENSIONE_SOL3, INPUT);
pinMode (TENSIONE_BM, INPUT);




//TEBNSIONE

  
  pinMode (AMP_BS, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
 pinMode (AMP_SOL, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL2, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL3, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
//pinMode (adc0,INPUT);
}







  

void loop() {
  
int16_t adc0, adc1, adc2, adc3;

  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");

Blynk.run();
timer.run();


  //  AMPEROMETRO
  double letturaTensioneInVolt;

  letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);


 double letturaTensioneInVoltsol;

  letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);


 double letturaTensioneInVoltsol2;

  letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);

double letturaTensioneInVoltsol3;

  letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);





  
  //Serial.print(analogRead(AMP_BS) );
  //Serial.print( "  " );
  //Serial.println(letturaTensioneInVolt, 2);

  //(tra parentesi, lascia perdere i float, usa i double -- se vuoi ti spiego perché, altrimenti fidati e basta :-)

  // a questo punto, applichiamo la conversione: per ACS 100 sono 20mV/A
  // quindi
  //correnteLetta = (2.5 - letturaTensioneInVolt ) * 1000 / 20;
  // moltiplico per 1000 per ottenere la lettura in millivolt, e divido per 20.
  // Dato che è 1000/20 è costante semplifico:

  double correnteLetta = (2.2999 - letturaTensioneInVolt ) * 50.0;   // bs amp
    double correnteLettasol = (2.5000 - letturaTensioneInVoltsol ) * 50.0;

double correnteLettasol2 = (2.5000 - letturaTensioneInVoltsol2 ) * 50.0;
double correnteLettasol3 = (2.5000 - letturaTensioneInVoltsol3 ) * 50.0;
    

  //nota: scrivo 50.0 per abitudine, perché in alcune circostanze il compilatore potrebbbe fare divisione fra interi

  // adesso il problema è che quel 2.5 è lo zero dell'amperometro.
  // con adeguata precisione, potresti usare un piccolo correttivo
  // (ad esempio, da un mio schema reale leggo 2.4754)
  // nel tuo caso, ti direi di pensarci in futuro, quando avrai ADS1115 per leggere tensioni


  // altro punto: la media delle 5 letture significa che devi leggere 5 volte la corrente, soomarla e fare la media.
  //quindi:

  double sommaTemporanea = correnteLetta;

  for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
    correnteLetta = (2.5 - letturaTensioneInVolt ) * -50.0;
    letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);

    sommaTemporanea = sommaTemporanea + correnteLetta;
  }

  correnteBS = sommaTemporanea / 5.0;



double sommaTemporaneasol = correnteLettasol;

  for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
    correnteLettasol = (2.5 - letturaTensioneInVoltsol ) * -50.0;
    letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);

    sommaTemporaneasol = sommaTemporaneasol + correnteLettasol;
  }

  correnteSOL = sommaTemporaneasol / 5.0;




double sommaTemporaneasol2 = correnteLettasol2;

  for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
    correnteLettasol2 = (2.5 - letturaTensioneInVoltsol2 ) * -50.0;
    letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);

    sommaTemporaneasol2 = sommaTemporaneasol2 + correnteLettasol2;
  }

  correnteSOL2 = sommaTemporaneasol2 / 5.0;




double sommaTemporaneasol3 = correnteLettasol3;

  for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
    correnteLettasol3 = (2.5 - letturaTensioneInVoltsol3 ) * -50.0;
    letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);

    sommaTemporaneasol3 = sommaTemporaneasol3 + correnteLettasol3;
  }

  correnteSOL3 = sommaTemporaneasol3 / 5.0;







  



  // SECONDA PARTE

  // la lettura BS diventa
  // double tensioneCorretta = tensioneAlPartitore * partitoreTensione ;
  // quindi


  
  tensioneBS = (5.0 / 1024 * analogRead(TENSIONE_BS)) * partitoreTensione ;
 tensioneSOL = (5.0 / 1024 * analogRead(TENSIONE_SOL)) * partitoreTensionesol ;
tensioneSOL2 = (5.0 / 1024 * analogRead(TENSIONE_SOL2)) * partitoreTensionesol2 ;
tensioneSOL3 = (5.0 / 1024 * analogRead(TENSIONE_SOL3)) * partitoreTensionesol3 ;
tensioneBM = (5.0 / 1024 * analogRead(TENSIONE_BM)) * partitoreTensionebm ;


  // STAMPA LCD
  lcd.clear();                     //pulisci  lcd
  lcd.setCursor(0, 0);    //posiziona il cursore sulla prima linea del display
  lcd.print("V ");
  lcd.print (tensioneBS, 1);
  lcd.print("  BS A ");
  lcd.print(correnteBS, 1);
  


  lcd.setCursor(0, 1);    //posiziona il cursore sulla prima linea del display
  lcd.print("V ");
  lcd.print (tensioneSOL, 1);
  lcd.print("  SOL A  ");
  lcd.print(correnteSOL, 1);

   lcd.setCursor(0, 2);    //posiziona il cursore sulla prima linea del display
  lcd.print("V ");
  lcd.print (tensioneSOL2, 1);
  lcd.print("  SOL2 A ");
  lcd.print(correnteSOL2, 1);

  lcd.setCursor(0, 3);    //posiziona il cursore sulla prima linea del display
  lcd.print("V ");
  lcd.print (tensioneSOL3, 1);
  lcd.print("  SOL3 A ");
  lcd.print(correnteSOL3, 1);
//lcd.print(adc0, 1);
  
  


//  2 LCD 

lcd2.clear();                     //pulisci  lcd
  lcd2.setCursor(0, 0);    //posiziona il cursore sulla prima linea del display
  lcd2.print("V ");
  lcd2.print (tensioneBS, 1);
  lcd2.print(" A BS ");
  lcd2.print(correnteBS, 1);

                    //pulisci  lcd
  lcd2.setCursor(0, 1);    //posiziona il cursore sulla prima linea del display
 lcd2.print("V  BM ");
  lcd2.print (tensioneBM, 1);
  
  

  // ********************* DA BOB -- FINE INTERVENTO

  delay(250);
//delay(250);

Blynk.run();
timer.run();
}

//void leggidati()  




BLYNK_READ(bsamp)   //1 amp


{
  Blynk.virtualWrite(bsamp, correnteBS);
 
  
  }                  






      BLYNK_READ(bsvolt)   //1 amp


{
  Blynk.virtualWrite(bsvolt, tensioneBS);
 
  
  }             





  BLYNK_READ(solamp)   //1 amp


{
  Blynk.virtualWrite(solamp, correnteSOL);
 
  
  }                  


BLYNK_READ(solvolt)   //1 amp


{
  Blynk.virtualWrite(solvolt, tensioneSOL);
 
  
  }                  




//2


BLYNK_READ(solamp2)   //1 amp


{
  Blynk.virtualWrite(solamp2, correnteSOL2);
 
  
  }                  


BLYNK_READ(solvolt2)   //1 amp


{
  Blynk.virtualWrite(solvolt2, tensioneSOL2);
 
  
  }                  

BLYNK_READ(solamp3)   //1 amp


{
  Blynk.virtualWrite(solamp3, correnteSOL3);
 
  
  }                  





BLYNK_READ(solvolt3)   //1 amp


{
  Blynk.virtualWrite(solvolt3, tensioneSOL3);
 
  
  }                  

BLYNK_READ(bmvolt)   //1 amp


{
  Blynk.virtualWrite(bmvolt, tensioneBM);
 
  
  }  

void leggibt() 


{
if (digitalRead(A5)){
Blynk.virtualWrite(V5, 255);
 }  else { 
Blynk.virtualWrite(V5, 0);
 } 


if (digitalRead(A6)){
Blynk.virtualWrite(V6, 255);
 }  else { 
Blynk.virtualWrite(V6, 0);
 } 

if (digitalRead(A7)){
Blynk.virtualWrite(V4, 255);
 }  else { 
Blynk.virtualWrite(V4, 0);
 } 

if (digitalRead(A8)){
Blynk.virtualWrite(V3, 255);
 }  else { 
Blynk.virtualWrite(V3, 0);
 } 




  } 

 


  



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 

calasci
KiloWatt


Gruppo:Utente
Messaggi:119

Stato:



Inviato il: 13/05/2019 07:17:53

CITAZIONE (calcola, 13/05/2019 04:25:45 ) Discussione.php?214354&2#MSG27

Appunto, è utile per scopi particolari dove la lettura al millesimo fa la differenza, non è il tuo caso. Per leggere la tensione dei pannelli il primo decimale è già sufficiente e lo stesso per la corrente, dove la precisione dipende dall'acs e non è che sia molto preciso.

Il codice per l'arduino devi postarlo con un copia incolla dentro il tag code, quindi prima selezioni il pulsante "code" sul menu' di sinistra e dentro il tag incolli il codice.





dovrei aumentare i sensori per aggiungere sonde temperature ,il mio problema e che non riesco a fare la media del ads1115,



---------------
Impianto camper 12v 2*300w 1*405W 1*280W solare a 38v 2x90A Lifepo4 Winston
3 Regolatore tracer 3210
1 regolatore 4210
frigorifero a compressore 220v casalingo

 
 InizioPagina
 

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

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum