Poprawa odczytu napięcia

UStawienie przycisku

Przesuniecie funkcji na góre kodu
This commit is contained in:
sieja
2025-06-15 16:13:32 +02:00
parent fea3421475
commit f3cc292bf8

View File

@@ -1,21 +1,12 @@
// #include <avr/eeprom.h>
#include <ESP32Servo.h> // model servo: DS3218 PRO #include <ESP32Servo.h> // model servo: DS3218 PRO
// nie włącza serovo
// nie podaje napięcia z baterii
#include <SPI.h> #include <SPI.h>
#include <Wire.h> #include <Wire.h>
#include <time.h> #include <time.h>
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> #include <Adafruit_SSD1306.h>
#define Version "2.1.0" #define Version "2.1.4"
////2DO: ////2DO:
//diagnostyka i/lub przeciwdziałanie skokom predkosci
//dlaczego wskaznik odnosi sie do poprawnego biegu a w tym czasie bieg jest zly? bo czas ponizej 2s?
//zmienic system usypiania dodac bezwzglednie czas 3 min, i po czeku z przyciskiem ponowny odczyt magnesu po 0,5sec
// menu do zmiany zakresu predkosci biegów // menu do zmiany zakresu predkosci biegów
// menu do zmiany zakresu kątów biegów, obwodu koła, ilosci magnesow // menu do zmiany zakresu kątów biegów, obwodu koła, ilosci magnesow
@@ -30,10 +21,10 @@ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ServoPin 19 //on board: D19 #define ServoPin 19 //on board: D19
#define BrakingLight 13 //on board: D13 BrakingLight #define BrakingLight 13 //on board: D13 BrakingLight
#define PinLED 25 //on board: D25 ORANGE loop signal #define PinLED 25 //on board: D25 ORANGE loop signal
#define Btn1 27 //on board: D27 Button1 #define VoltInptPin 27 //on board: D27
#define Btn2 33 //on board: D33 Button2 #define Btn2 33 //on board: D33 Button2
// #define VoltInptPin 23 //on board: D23 Battery Voltage // #define VoltInptPin 23 //on board: D23 Battery Voltage prawdopodobnie uszkodzone ADC
#define ServoMaxAngle 130 #define ServoMaxAngle 130
#define MaxAngle 179 #define MaxAngle 179
@@ -51,6 +42,7 @@ Servo myservo;
//SPEED //SPEED
double readSignalTime_5;
double readSignalTime_4; double readSignalTime_4;
double readSignalTime_3; double readSignalTime_3;
double readSignalTime_2; double readSignalTime_2;
@@ -116,9 +108,9 @@ double totalDist = 0.0;
unsigned int totalDistReaded = 0; unsigned int totalDistReaded = 0;
unsigned int totalDistWrited = 0; unsigned int totalDistWrited = 0;
//BATTERY //BATTERY
float referenceVoltage = 5.1; float referenceVoltage = 3.3;
int maxADCValue = 1023; int maxADCValue = 4095;
float voltageDividerRatio = 3.0; float voltageDividerRatio = 5.7;
int adcBattVoltValue = 0; int adcBattVoltValue = 0;
float inputVoltage = 0.0; float inputVoltage = 0.0;
float measuredVoltage = 0.0; float measuredVoltage = 0.0;
@@ -158,10 +150,10 @@ void setup() {
pinMode(PinInSpeed, INPUT); pinMode(PinInSpeed, INPUT);
// pinMode(PinInterrupt, OUTPUT); // pinMode(PinInterrupt, OUTPUT);
// digitalWrite(PinInterrupt, HIGH); // digitalWrite(PinInterrupt, HIGH);
pinMode(Btn1, INPUT); pinMode(VoltInptPin, INPUT);
pinMode(Btn2, INPUT); pinMode(Btn2, INPUT);
// pinMode(VoltInptPin, INPUT);
//OUTPUT //OUTPUT
pinMode(PinLED, OUTPUT); pinMode(PinLED, OUTPUT);
pinMode(BrakingLight, OUTPUT); pinMode(BrakingLight, OUTPUT);
@@ -201,138 +193,33 @@ void setup() {
// totalDist = float(totalDistReaded); // totalDist = float(totalDistReaded);
} }
//########################################### LOOP ############################################################
//########################################### LOOP ############################################################
void loop() {
loopTime = millis(); void setPosition(int currentGear) {
display.clearDisplay(); pos = 180 - round((currentGear - 1) * (ServoMaxAngle / (MaxGear - 1) ));
// //DIAG Btn1 if (pos >= 180) {
// display.setTextSize(1); pos = MaxAngle;
// display.setCursor(0, 30); }
// display.println("Btn1:");
// display.setCursor(30, 20);
// display.println(digitalRead(Btn1));
// display.setCursor(30, 30);
// display.println(analogRead(Btn1));
// display.setCursor(55, 30);
display.setTextSize(3); if (pos <= 0) {
pos = MinAngle;
//################################################ }
//SPEED if (sleepMode == 1 && calcSpeedMain > 0.0) {
sleepSpd = millis() - millissSpd; digitalWrite(ServoSwitch, HIGH);
if (sleepSpd >= 1000.0) { //podaj zerową prędkość jeśli nie było odcztu od 1,5 s for (servoCurrPos = myservo.read(); servoCurrPos <= 180; servoCurrPos++) {
speed4Gear = 0.0; myservo.write(servoCurrPos);
speed4Gear_2 = 0.0; delay(4);
raw_speed = 0.0;
//przejście w tryb uśpienia za pomocą odpowiedniego ustawienia koła i magnesu
if ((digitalRead(PinInSpeed) == LOW)||(digitalRead(Btn2) == HIGH)|| (sleepSpd >= LongTimeToSleep)) {
display.fillCircle(75, 10, 10, SSD1306_WHITE);
if (sleepSpd >= TimeToSleep) {
prepareTurnOff();
}
}
} }
sleepMode = 0;
if (speed4Gear > 40 || isinf(speed4Gear)) {
speed4Gear = speed4Gear_3;
} }
calcSpeed(); myservo.write(pos);
calcGear();
displGear = 9 - currentGear;
setPosition(currentGear);
//duzy font
//GEAR
display.setCursor(8, 0);
display.println("G:");
display.setCursor(40, 0);
display.print(currentGear);
//SPEED_TREND
display.setCursor(75, 00);
if (speedTrend <= -1 ) {
display.write(31);
} else {
if (speedTrend >= 1) {
display.write(30);
} else {
display.println("-");
}
}
//SPEED
display.setCursor(8, 40);
display.println("S:");
display.setCursor(40, 40);
display.println(calcSpeedMain, 1);
//GearBar
currentGearRangeMiddle = (currentGearRangeLower + currentGearRangeUpper) / 2;
display.fillRect(115, 32, 7, 1, SSD1306_WHITE);
display.fillRect(115, 0, 7, 1, SSD1306_WHITE);
display.fillRect(115, 63, 7, 1, SSD1306_WHITE);
display.setTextSize(2);
gearBarHeight = 64 - int(((calcSpeedMain - currentGearRangeLower) / (currentGearRangeUpper - currentGearRangeLower)) * 64) - 5;
display.setCursor(115, gearBarHeight);
display.write(16);
display.setTextSize(3);
//VOLT_BAR
// adcBattVoltValue = analogRead(VoltInptPin);
// measuredVoltage = (adcBattVoltValue * referenceVoltage) / maxADCValue;
// inputVoltage = measuredVoltage * voltageDividerRatio;
voltBarHeight = int(((inputVoltage-9)/3)*64); //odjemowanie 9 bo to minimalne napiecie, podział przez 3 bo zakladam max napiecie 12.0V a nie 12.6V
voltBarPosition = 64 - voltBarHeight;
display.fillRect(0, voltBarPosition, 1, voltBarHeight, SSD1306_WHITE);
//########################################## ZAPIS DO WYŚWIETLACZA ######################################################
display.display();
loopTime = millis();
if ((digitalRead(Btn2) == HIGH)) {
digitalWrite(PinLED, HIGH);
}else {
digitalWrite(PinLED, LOW);
}
//wstrzymanie pętli by odczyty były co 0,5s
for (; (millis() - loopTime) < 300 ;) {
delay(10);
}
if (speedTrend == -1 && speed4Gear > 0.0 ) {
if (BrakingLightSwitch == 1) {
digitalWrite(BrakingLight, HIGH);
BrakingLightSwitch = 0;
} else {
digitalWrite(BrakingLight, LOW);
BrakingLightSwitch = 1;
}
} else {
digitalWrite(BrakingLight, LOW);
}
// //TTL DST
// // totalDist = 0;
// loop_cnt = loop_cnt +1;
// if (loop_cnt >= 20 //&& totalDistWrited != totalDist
// ){
// totalDistWrited = int(totalDist);
// // eeprom_write_block(&totalDistWrited,totalDistMemLocation,2);
// loop_cnt = 0;
// }
} }
//########################################### LOOP ############################################################
//########################################### LOOP ############################################################
void readSpeed() { void readSpeed() {
lastLastMillisSpd = lastMillisSpd; lastLastMillisSpd = lastMillisSpd;
lastMillisSpd = millissSpd; lastMillisSpd = millissSpd;
millissSpd = millis(); millissSpd = millis();
readSignalTime_5 = readSignalTime_4;
readSignalTime_4 = readSignalTime_3;
readSignalTime_3 = readSignalTime_2; readSignalTime_3 = readSignalTime_2;
readSignalTime_2 = readSignalTime_1; readSignalTime_2 = readSignalTime_1;
readSignalTime_1 = double(millissSpd - lastLastMillisSpd) / 1000; readSignalTime_1 = double(millissSpd - lastLastMillisSpd) / 1000;
@@ -342,6 +229,81 @@ void readSpeed() {
} }
void prepareTurnOff() {
sleepMode = 1;
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Przygotwywanie...");
display.display();
for (servoCurrPos = myservo.read(); servoCurrPos >= 60; servoCurrPos--) {
myservo.write(servoCurrPos);
delay(15);
}
//Na czas diagnostyki
// eeprom_write_block(&totalDist,totalDistMemLocation,2);
// totalDistWrited = totalDist;
// loop_cnt = 0;
//
for (; 1500 < (millis() - lastMillisSpd);) { // zmiana z 1000 na 1500 w 1.13.19
digitalWrite(ServoSwitch, LOW);
digitalWrite(ServoPin, LOW);
//INFO
display.clearDisplay();
display.setTextSize(1);
display.setCursor(5, 30);
display.println("Mozna teraz");
display.setCursor(5, 38);
display.println("bezpiecznie wylaczyc");
display.setCursor(5, 46);
display.println("komputer.");
display.setCursor(5, 0);
display.write(31);
display.setCursor(10, 0);
display.println("+");
display.setCursor(15, 0);
display.write(30);
display.setCursor(25, 0);
display.println(downs + ups);
//Version
display.setCursor(5, 13);
display.println("V: ");
display.setCursor(15, 13);
display.println(Version);
//DST
display.setCursor(50, 0);
display.println("Spins: ");
display.setCursor(85, 0);
display.println(totalDistWrited);
display.setCursor(58, 13);
display.println("KM: ");
display.setCursor(95, 13);
display.println((totalDistWrited*WheelCircumference)/1000);
//RUN TIME
run_mins = floor((millis() / 1000) / 60);
run_hrs = floor(run_mins / 60);
run_mins = run_mins - (run_hrs * 60);
display.setCursor(65, 54);
display.println("T:");
display.setCursor(80, 54);
display.println(run_hrs);
display.setCursor(88, 54);
display.println(":");
display.setCursor(93, 54);
display.println(run_mins);
adcBattVoltValue = analogRead(VoltInptPin);
measuredVoltage = (adcBattVoltValue * referenceVoltage) / maxADCValue;
inputVoltage = measuredVoltage * voltageDividerRatio;
voltBarHeight = int(((inputVoltage-9)/3)*64); //odjemowanie 9 bo to minimalne napiecie, podział przez 3 bo zakladam max napiecie 12.0V a nie 12.6V
voltBarPosition = 64 - voltBarHeight;
display.fillRect(0, voltBarPosition, 2, voltBarHeight, SSD1306_WHITE);
display.display();
delay(500);
}
}
void calcSpeed(){ void calcSpeed(){
calcSpeed3 = calcSpeed2; calcSpeed3 = calcSpeed2;
calcSpeed2 = calcSpeed1; calcSpeed2 = calcSpeed1;
@@ -396,89 +358,129 @@ void calcGear() {
} }
void setPosition(int currentGear) {
pos = 180 - round((currentGear - 1) * (ServoMaxAngle / (MaxGear - 1) ));
if (pos >= 180) {
pos = MaxAngle;
}
if (pos <= 0) {
pos = MinAngle;
}
if (sleepMode == 1 && calcSpeedMain > 0.0) {
digitalWrite(ServoSwitch, HIGH);
for (servoCurrPos = myservo.read(); servoCurrPos <= 180; servoCurrPos++) {
myservo.write(servoCurrPos);
delay(4);
}
sleepMode = 0;
}
myservo.write(pos);
}
void prepareTurnOff() { //########################################### LOOP ############################################################
sleepMode = 1; //########################################### LOOP ############################################################
void loop() {
loopTime = millis();
display.clearDisplay(); display.clearDisplay();
display.setTextSize(1); // //DIAG Btn1
display.setCursor(0, 0); // display.setTextSize(1);
display.println("Przygotwywanie..."); // display.setCursor(0, 30);
display.display(); // display.println("Btn1:");
for (servoCurrPos = myservo.read(); servoCurrPos >= 60; servoCurrPos--) { // display.setCursor(30, 20);
myservo.write(servoCurrPos); // display.println(digitalRead(Btn1));
delay(15); // display.setCursor(30, 30);
// display.println(analogRead(Btn1));
// display.setCursor(55, 30);
display.setTextSize(3);
//################################################
//SPEED
sleepSpd = millis() - millissSpd;
if (sleepSpd >= 1000.0) { //podaj zerową prędkość jeśli nie było odcztu od 1,5 s
speed4Gear = 0.0;
speed4Gear_2 = 0.0;
raw_speed = 0.0;
} }
//Na czas diagnostyki //przejście w tryb uśpienia za przuycisku lub czasu
// eeprom_write_block(&totalDist,totalDistMemLocation,2); if ((digitalRead(Btn2) == HIGH)|| (sleepSpd >= LongTimeToSleep)) {
// totalDistWrited = totalDist; prepareTurnOff();
// loop_cnt = 0; }
//
for (; 1500 < (millis() - lastMillisSpd);) { // zmiana z 1000 na 1500 w 1.13.19 if (speed4Gear > 40 || isinf(speed4Gear)) {
digitalWrite(ServoSwitch, LOW); speed4Gear = speed4Gear_3;
digitalWrite(ServoPin, LOW); }
//INFO calcSpeed();
display.clearDisplay(); calcGear();
display.setTextSize(1); displGear = 9 - currentGear;
display.setCursor(0, 30); setPosition(currentGear);
display.println("Mozna teraz");
display.setCursor(0, 38);
display.println("bezpiecznie wylaczyc"); //duzy font
display.setCursor(0, 46); //GEAR
display.println("komputer."); display.setCursor(8, 0);
display.setCursor(0, 0); display.println("G:");
display.setCursor(40, 0);
display.print(currentGear);
//SPEED_TREND
display.setCursor(75, 00);
if (speedTrend <= -1 ) {
display.write(31); display.write(31);
display.setCursor(5, 0); } else {
display.println("+"); if (speedTrend >= 1) {
display.setCursor(10, 0); display.write(30);
display.write(30); } else {
display.setCursor(20, 0); display.println("-");
display.println(downs + ups); }
//Version
display.setCursor(0, 13);
display.println("V: ");
display.setCursor(10, 13);
display.println(Version);
//DST
display.setCursor(45, 0);
display.println("Spins: ");
display.setCursor(80, 0);
display.println(totalDistWrited);
display.setCursor(53, 13);
display.println("KM: ");
display.setCursor(90, 13);
display.println((totalDistWrited*WheelCircumference)/1000);
//RUN TIME
run_mins = floor((millis() / 1000) / 60);
run_hrs = floor(run_mins / 60);
run_mins = run_mins - (run_hrs * 60);
display.setCursor(60, 54);
display.println("T:");
display.setCursor(75, 54);
display.println(run_hrs);
display.setCursor(83, 54);
display.println(":");
display.setCursor(88, 54);
display.println(run_mins);
display.display();
delay(500);
} }
//SPEED
display.setCursor(8, 40);
display.println("S:");
display.setCursor(40, 40);
display.println(calcSpeedMain, 1);
//GearBar
currentGearRangeMiddle = (currentGearRangeLower + currentGearRangeUpper) / 2;
display.fillRect(115, 32, 7, 1, SSD1306_WHITE);
display.fillRect(115, 0, 7, 1, SSD1306_WHITE);
display.fillRect(115, 63, 7, 1, SSD1306_WHITE);
display.setTextSize(2);
gearBarHeight = 64 - int(((calcSpeedMain - currentGearRangeLower) / (currentGearRangeUpper - currentGearRangeLower)) * 64) - 5;
display.setCursor(115, gearBarHeight);
display.write(16);
display.setTextSize(3);
//VOLT_BAR
adcBattVoltValue = analogRead(VoltInptPin);
measuredVoltage = (adcBattVoltValue * referenceVoltage) / maxADCValue;
inputVoltage = measuredVoltage * voltageDividerRatio;
voltBarHeight = int(((inputVoltage-9)/3)*64); //odjemowanie 9 bo to minimalne napiecie, podział przez 3 bo zakladam max napiecie 12.0V a nie 12.6V
voltBarPosition = 64 - voltBarHeight;
display.fillRect(0, voltBarPosition, 2, voltBarHeight, SSD1306_WHITE);
//########################################## ZAPIS DO WYŚWIETLACZA ######################################################
display.display();
loopTime = millis();
if ((digitalRead(Btn2) == HIGH)) {
digitalWrite(PinLED, HIGH);
}else {
digitalWrite(PinLED, LOW);
}
//wstrzymanie pętli by odczyty były co 0,5s
for (; (millis() - loopTime) < 300 ;) {
delay(10);
}
if (speedTrend == -1 && speed4Gear > 0.0 ) {
if (BrakingLightSwitch == 1) {
digitalWrite(BrakingLight, HIGH);
BrakingLightSwitch = 0;
} else {
digitalWrite(BrakingLight, LOW);
BrakingLightSwitch = 1;
}
} else {
digitalWrite(BrakingLight, LOW);
}
// //TTL DST
// // totalDist = 0;
// loop_cnt = loop_cnt +1;
// if (loop_cnt >= 20 //&& totalDistWrited != totalDist
// ){
// totalDistWrited = int(totalDist);
// // eeprom_write_block(&totalDistWrited,totalDistMemLocation,2);
// loop_cnt = 0;
// }
} }
//########################################### LOOP ############################################################
//########################################### LOOP ############################################################