1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
// Table des tensions nominales pour DIP switch
float tensions[8] = {1.5, 3.0, 3.7, 4.5, 6.0, 9.0, 12.0, 0};
// Broches
const int analogPin = A0; // mesure pile
const int dipPins[8] = {3,4,5,6,7,8,9,10}; // DIP switch
// Diviseur de tension
const float R1 = 98400.0; // ohms valeur mesurée
const float R2 = 67800.0; // ohms valeur mesurée
const float Correction = 0;
const float coeffDiv = (R1+R2)/R2;
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
for(int i=0;i<8;i++){
pinMode(dipPins[i], INPUT_PULLUP); // DIP vers GND
}
}
void loop() {
// Lire la tension de la pile
int raw = analogRead(analogPin);
float Vmes = (map(raw, 0, 1023, 0, 5000) * coeffDiv )/1000 ;
//Vmes = Vmes + (Correction*Vnom) ;
Serial.println(Vmes);
// Déterminer quel DIP est activé
int index = -1;
for(int i=0;i<8;i++){
if(digitalRead(dipPins[i]) == LOW) {
index = i;
break;
}
}
Serial.println(index);
// Si aucun DIP afficher erreur
if(index == -1 || tensions[index] == 0){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 20);
display.print("Choisir DIP!");
display.display();
delay(500);
return;
}
// Calcul pourcentage
bool HG = false ;
float Vnom = tensions[index];
Vmes = Vmes + (Correction*Vnom) ;
int pourcent = (int)((Vmes / Vnom) * 100.0);
if(pourcent > 100) {
pourcent = 100;
HG = true ;
}else{
HG = false ;
}
if(pourcent < 0) pourcent = 0;
// Affichage
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Type : ");
display.print(Vnom,1);
display.print(" V");
display.setCursor(0,20);
display.print("Mesure : ");
display.print(Vmes,2);
display.print(" V");
display.setCursor(0,40);
display.print("Etat : ");
display.print(pourcent);
display.print(" %");
display.setCursor(20,50);
if (HG) {
display.print("Hors Gamme");
}else{
display.print(" ");
}
display.display();
delay(2000);
} |
Partager