Buongiorno a tutti, torno sul topic dopo un pezzo che non scrivevo nulla.
Sto ancora aspettando i display dalla Cina, intanto però è arrivato l'Arduino Pro Micro di concorrenza.
Subito una domanda: come lo alimento? Vedo sullo schema che c'è un ponte fra "valle" e "monte" del regolatore di tensione. Chiudendo il ponte il microprocessore e tutte le uscite sono alimentate a 5 volt, mentre lasciandolo aperto viene alimentato a 3.3 volt. I 5 volt però provengono dalla presina USB che non mi piace, io vorrei un'alimentazione dedicata senza tenere collegata la USB e in caso collegarmi con il PC per fare degli aggiustaggi nel software.
In pratica mi dovrei fare un circuito di regolazione della tensione da 12 Volt (trasformatore esterno dalla 220 di rete) a 5 Volt con un semplice LM7805 e poi portare il positivo al VCC sul pin 4.
Ho capito che posso gestire due display diversi tramite SPI, due pin di reset, due pin cs, due pin rs, un pin per il clock e uno mosi, in tutto fanno 8 pin. Però dovrò scoprire come funzionano i pin dei display.
Per il codice, l'ho rifatto con le mie idee, non so se sia corretto e spero si capisca "fra le righe" che cosa voglio fare:
#define sclk 13 /* clock della comunicazione SPI, in comune */
#define mosi 11 /* comunicazione unidirezionale master -> slave, in comune */
#define cs1 10 /* selezione dello slave 1, primo display */
#define rs1 9 /* , primo display */
#define rst1 8 /* reset dello slave 1, primo display */
#define cs2 7 /* selezione dello slave 2, secondo display */
#define rs2 6 /* , secondo display */
#define rst2 5 /* reset dello slave 2, secondo display */
#include <SPI.h> /* libreria per comunicazione SPI */
#include <Adafruit_GFX.h> /* libreria grafica di Adafruit */
#include <Adafruit_ST7735.h> /* libreria per il chip ST7735 di gestione del display */
Adafruit_ST7735 display1 = Adafruit_ST7735(cs1, rs1, rst1); /* creazione oggetto display1 per la libreria Adafruit di gestione del chip del display */
Adafruit_ST7735 display2 = Adafruit_ST7735(cs2, rs2, rst2); /* creazione oggetto display2 per la libreria Adafruit di gestione del chip del display */
#define Vref 5.0 /* calibrazione della tensione di riferimento delle misure */
/*
siccome Arduino legge in entrata al massimo 5 v, devo dividere con un partitore di tensione la Vin.
Per fare ciò utilizzo una Ra = 680 k Ohm e una Rb = trimmer 200 k Ohm.
*/
/*
il valore dei seguenti div sarà dato da Vin(max) / 5 .
Vin(max) viene calcolata con 5 / (Rb / (Ra + Rb)). Quindi div = (Ra + Rb) / Rb.
Ma siccome Ra è fisso, basta inserire il valore di Rb.
*/
int Ra1 = 680000; /* valore in Ohm di Ra1 */
int Rb1 = 200000; /* valore in Ohm di Rb1 */
int Ra2 = 680000; /* valore in Ohm di Ra2 */
int Rb2 = 200000; /* valore in Ohm di Rb2 */
int Ra3 = 680000; /* valore in Ohm di Ra3 */
int Rb3 = 200000; /* valore in Ohm di Rb3 */
int Ra4 = 680000; /* valore in Ohm di Ra4 */
int Rb4 = 200000; /* valore in Ohm di Rb4 */
int Vdigital[4] = {0, 0, 0, 0};
int VdigitalMAX[4] = {0, 0, 0, 0};
int Vanalog[4] = {0.00, 0.00, 0.00, 0.00};
int VanalogMAX[4] = {0.00, 0.00, 0.00, 0.00};
int coef[4] = {((Ra1 + Rb1) / Rb1), ((Ra2 + Rb2) / Rb2), ((Ra3 + Rb3) / Rb3), ((Ra4 + Rb4) / Rb4)}; /* array di valori fissi dati dalle resistenze di ogni canale */
void readCH(byte n){
unsigned int Somma;
byte Sample = 0;
for (Sample <= 31; Sample++;){
Somma = Somma + analogRead(n);
}
Vdigital[n] = Somma / 32;
Somma = 0;
Sample = 0;
}
void conversionDA(byte n){
Vanalog[n] = (Vref * Vdigital[n]) / 1023 ;
VanalogMAX[n] = (Vref * Vdigital[n]) / 1023 ;
}
void detectMAX(){
for (byte contCH = 0; contCH < 3; contCH++) {
if(Vdigital[contCH] > VdigitalMAX[contCH]){
VdigitalMAX[contCH] = Vdigital[contCH];
}
}
}
bool select = false;
bool reset = false;
void keyboard(){
byte keyboard = analogRead(A4);
if (keyboard > 725){select = true;}
else {select = false;}
if(keyboard < 724 && keyboard > 0){reset = true;}
else {reset = false;}
}
void resetMAX(){
byte contMAX = 0;
if (select){contMAX++;}
for (byte contMAX; contMAX <= 3;){
if (reset){VdigitalMAX[contMAX] = 0;}
}
}
void printCH0(){
display1.setTextColor(ST7735_GREEN,ST7735_BLACK);
display1.setTextSize(2);
display1.setCursor(40, 15);
display1.print("VERDE ");
display1.setCursor(40, 33);
display1.print(Vanalog[0] * coef[0], 1);
display1.print("V ");
display1.setTextColor(ST7735_WHITE,ST7735_BLACK);
display1.setTextSize(1);
display1.setCursor(30, 53);
display1.print("Vmax ");
display1.print(VanalogMAX[0] * coef[0], 1);
display1.print("V ");
}
void printCH1(){
display1.setTextColor(ST7735_YELLOW,ST7735_BLACK);
display1.setTextSize(2);
display1.setCursor(25, 80);
display1.print("GIALLA ");
display1.setCursor(40, 100);
display1.print(Vanalog[1] * coef[1], 1);
display1.print("V ");
display1.setTextColor(ST7735_WHITE,ST7735_BLACK);
display1.setTextSize(1);
display1.setCursor(30, 120);
display1.print("Vmax ");
display1.print(VanalogMAX[1] * coef[1], 1);
display1.print("V ");
}
void printCH2(){
display2.setTextColor(ST7735_RED,ST7735_BLACK);
display2.setTextSize(2);
display2.setCursor(40, 15);
display2.print("ROSSO ");
display2.setCursor(40, 33);
display2.print(Vanalog[2] * coef[2], 1);
display2.print("V ");
display2.setTextColor(ST7735_WHITE,ST7735_BLACK);
display2.setTextSize(1);
display2.setCursor(30, 53);
display2.print("Vmax ");
display2.print(VanalogMAX[2] * coef[2], 1);
display2.print("V ");
}
void printCH3(){
display2.setTextColor(ST7735_BLUE,ST7735_BLACK);
display2.setTextSize(2);
display2.setCursor(25, 80);
display2.print("BLU ");
display2.setCursor(40, 100);
display2.print(Vanalog[3] * coef[3], 1);
display2.print("V ");
display2.setTextColor(ST7735_WHITE,ST7735_BLACK);
display2.setTextSize(1);
display2.setCursor(30, 120);
display2.print("Vmax ");
display2.print(VanalogMAX[3] * coef[3], 1);
display2.print("V ");
}
void setup() {
display1.initR(INITR_BLACKTAB); /* inizializza il chip ST7735 per il display1 */
display1.fillScreen(ST7735_BLACK); /* pulisci il display1 */
display1.setTextColor(ST7735_WHITE); /* imposta il bianco come colore del testo */
display1.setTextSize(1); /* imposta la grandezza del testo */
display1.setCursor(5,0); /* imposta la posizione sul display1 */
display1.println("GOSLOT"); /* scrivi */
display1.setTextColor(0XFF00); /* imposta il colore rosso per il testo */
display1.setCursor(12,150); /* imposta la posizione sul display1 */
display1.println("Voltaggio MAX: 22 v"); /* scrivi */
display2.initR(INITR_BLACKTAB); /* inizializza il chip ST7735 per il display2 */
display2.fillScreen(ST7735_BLACK); /* pulisci il display2 */
display2.setTextColor(ST7735_WHITE); /* imposta il bianco come colore del testo */
display2.setTextSize(1); /* imposta la grandezza del testo */
display2.setCursor(5,0); /* imposta la posizione sul display2 */
display2.println("GOSLOT"); /* scrivi */
display2.setTextColor(0XFF00); /* imposta il colore rosso per il testo */
display2.setCursor(12,150); /* imposta la posizione sul display2 */
display2.println("Voltaggio MAX: 22 v"); /* scrivi */
}
void loop() {
keyboard();
readCH(0);
readCH(1);
readCH(2);
readCH(3);
detectMAX();
resetMAX();
conversionDA(0);
conversionDA(1);
conversionDA(2);
conversionDA(3);
printCH0();
printCH1();
printCH2();
printCH3();
}