Citazione:
Originalmente inviato da dex1 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 |
Tenendo presente tutto quello che fin'ora è stato detto (dovrei aver messo tutto):
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 128 // number of samples to take befor displaying (128=2^7)
// voltage divider calibration values
#define Dv1 11.00
#define Dv2 11.00
//number of channels
#define N_CH 2
// ADC reference voltage / calibration value
#define VREF 5.00
unsigned int u16_sum[2] = {0, 0}; // u16_sums of samples taken
unsigned char u8_Scount = 0; // current sample number
float f32_AVvolts[2] = {0.0, 0.0}; // calculated voltages
char u8_cnt1 = 0; // used in 'for' loops
float f32_V_max[2] = {0.00 ,0.00};
float f32_V_min[2] = {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, 10, 120, 110, 5,ST7735_WHITE);
tft.setTextSize(1);
tft.setCursor(5,0);
tft.println("2 channel voltmeter");
tft.setTextColor(0XFF00);
tft.setCursor(0,140);
tft.println(" Caution max voltage 55vdc");
}
void loop()
{
ADC_Reading(); //Read voltages
MaxMin_Detection(); //Detect MAX/MIN and mean
Print_V1(); //Display V1 and V2 voltages
Print_V2();
tft.drawRoundRect(2, 10, 120, 120, 5,ST7735_WHITE); // draw a rectangle
Reset_var(); //Reset variables
}
void ADC_Reading(){
while (u8_Scount < NSAMP) {
// sample each channel A0 to A1
for (u8_cnt1 = 0; u8_cnt1 < N_CH; u8_cnt1++) {
u16_sum[u8_cnt1] += analogRead(A0 + u8_cnt1);
}
u8_Scount++;
delay(10);
}
}
void MaxMin_Detection(){
// calculate the voltage for each channel
for (u8_cnt1 = 0; u8_cnt1 < N_CH; u8_cnt1++) {
f32_AVvolts[u8_cnt1] = ((u16_sum[u8_cnt1]>>7) * VREF) / 1024.0;
if(f32_AVvolts[u8_cnt1] > f32_V_max[u8_cnt1]){ //get MAX value of sample
f32_V_max[u8_cnt1] = f32_AVvolts[u8_cnt1];
}
if(f32_AVvolts[u8_cnt1] < f32_V_min[u8_cnt1]){ //get MIN value of sample
f32_V_min[u8_cnt1] = f32_AVvolts[u8_cnt1];
}
}
}
void Print_V1(){
// voltage 1 - V1(pin A0)
tft.setTextColor(ST7735_YELLOW,ST7735_BLACK); // set color for V1
tft.setTextSize(3);
tft.setCursor(15, 20);
tft.print("V1 ");
tft.print(f32_AVvolts[0] * Dv1, 1);
tft.print("V ");
// voltage 1 - mean of V1
tft.setTextColor(ST7735_GREEN,ST7735_BLACK);// set color for V1
tft.setTextSize(2);
tft.setCursor(15, 46);
tft.print("Vmax ");
tft.print(f32_V_max[1] * Dv1, 1);
tft.print("V ");
tft.setCursor(15, 63);
tft.print("Vmin ");
tft.print(f32_V_min[1] * Dv1, 1);
tft.print("V ");
}
void Print_V2(){
// voltge 2 - V2 (pin A1)
tft.setTextColor(ST7735_CYAN,ST7735_BLACK);// set color for V3
tft.setTextSize(3);
tft.setCursor(15, 80);
tft.print("V2 ");
tft.print(f32_AVvolts[2] * Dv2, 1);
tft.print("V ");
// voltage 2 - mean of V2
tft.setTextColor(ST7735_WHITE,ST7735_BLACK);// set color for V4
tft.setTextSize(2);
tft.setCursor(15, 106);
tft.print("Vmax ");
tft.print(f32_V_max[2] * Dv2, 1);
tft.print("V ");
tft.setCursor(15, 123);
tft.print("Vmin ");
tft.print(f32_V_min[2] * Dv2, 1);
tft.print("V ");
}
void Reset_var(){
// reset variables
u8_Scount = 0;
for (u8_cnt1 = 0; u8_cnt1 < N_CH; u8_cnt1++) {
u16_sum[u8_cnt1] = 0;
}
}
Sul display dovresti vedere una cosa del genere:
2 channels voltmeter
/--------------------------------------------\
V1 0.00 V
Vmax 0.00V
Vmin 0.00V
V2 0.00 V
Vmax 0.00V
Vmin 0.00V
\--------------------------------------------/
Caution max voltage
55vdc
Se le scritte sono decentrate o non allineate correggi tu in base a quello che vedi su display agendo su
tft.setTextSize(),
tft.setCursor() e
tft.drawRoundRect()