Hallo allerseits,
die Punkte sind schon da, nur zu klein. Ich komme mit dem Programm noch so richtig zurecht.
Nur wer nichts macht, macht keine Fehler . . .
Das schwarze Rechteck ist natürlich die Speicherdrossel. Der zweite Spannungsteiler ist identisch mit dem ersten.
Ist wieder typisch Techniker, der denkt, was er denkt, wissen auch die anderen.
Ich versuche das mal mit der Code:
lader.ino
// Einbinden der Anzeige
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display Blau
// Anschlussbelegung Display
// Analog 4 = SDA Anzeige (Daten)
// Analog 5 = SCL Anzeige (Takt)
// Display -> I2C Modul +LCD 1602A 16x2 Blau Zeichen Display HD44780 LCD1602
// benoetigte Ports
int m_strom = 3; // Analog 3 = strom
int m_spannung = 2; // Analog 2 = Spannung
int puls_port = 11; // Ausgang Transistor
int puls_aus = 0; // Tackt transistor
int tast6 = 2; int tast12 = 3; // Starttasten
// Ladewerte
long end_6V = 6600; long end_12V = 13200; // Ladeendspannung in milli Volt
long strom_max = 0; long strom_max_6 = 400; long strom_max_12 = 500; // Ladestrom in milli Ampere
int delta_strom = 0; int delta_strom_6 = 3; int delta_strom_12 = 5; // Schrittweite beim erste Hochfahren
// Messwerte und Variabele
long spannung = 0; long strom = 0;
long korektur_v = 1560000; long korektur_a = 1564000;
long end_v = 0; // Endspannung nach Wahl des Akku
int zw1 = 0; int zw2 = 0; int zw3 = 0; //Zaelwert
int spannung1 = 0; int spannung2 = 0; int spannung3 = 0;
int strom1 = 0; int strom2 = 0; int strom3 = 0;
//--------------------------------------------------------------------------------
void setup()
{
pinMode (puls_port, OUTPUT); digitalWrite (puls_port, LOW);
lcd.init(); // initialize the lcd
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0); lcd.print("Ladegeraet 12/6V");
lcd.setCursor(3, 1); lcd.print("Eingang 12V");
delay(3000);
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(2, 0); lcd.print("Bitte Akku");
lcd.setCursor(3, 1); lcd.print("anklemmen");
digitalWrite (tast6, HIGH); digitalWrite (tast12, HIGH); // Pullup Tasten
}
//-------------------------------------------------------------------------------------------------------------------
void loop() {
// Warten auf Spannung --------------------------------------------
do {
zw2 = analogRead(m_spannung);
if (zw2 > 200)
{
spannung_messen();
if (zw2 == zw3) {
zw1++;
lcd.setCursor(0, 1); lcd.print(" ");
} else {
zw1 = 0;
};
zw3 = zw2;
} else {
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(2, 0); lcd.print("Bitte Akku");
lcd.setCursor(3, 1); lcd.print("anklemmen");
delay(500); zw1 = 0;
};
}
while (zw1 < 3);
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
// Warten auf Taste -------------------------------------------------
lcd.setCursor(0, 0); lcd.print(" Starttaste ");
lcd.setCursor(0, 1); lcd.print(" 12 V oder 6 V ");
zw1 = 0; zw2 = 0; zw3 = 0; // loeschen Zaehlwerte
do {
if (digitalRead(tast6) == 0) {
zw1 = 1; end_v = end_6V;
strom_max = strom_max_6 ; delta_strom = delta_strom_6;
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(0, 0); lcd.print(" Laden 6 V ");
lcd.setCursor(0, 1); lcd.print(" wird gestartet ");
};
if (digitalRead(tast12) == 0) {
zw1 = 1; end_v = end_12V;
strom_max = strom_max_12 ; delta_strom = delta_strom_12;
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(0, 0); lcd.print(" Laden 12 V ");
lcd.setCursor(0, 1); lcd.print(" wird gestartet ");
};
} while (zw1 == 0);
delay(3000);
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
zw1 = 0; zw2 = 0; zw3 = 0; // loeschen Zaehlwerte
// Laden ---------------------------------------------------------
puls_aus = 0; analogWrite(puls_port, puls_aus);
do {
spannung_strom_messen();
if (strom < strom_max) {
puls_aus = puls_aus + delta_strom; // Strom zu niedrig
};
if (strom > strom_max) {
puls_aus--; // Strom zu hoch
};
if (strom > strom_max-75) {
delta_strom = 1; // Kleine Näherung an Sollwert
};
analogWrite(puls_port, puls_aus);
}
while (spannung < end_v); // Ladeendspannung ereicht
// End -----------------------------------------------------------
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(6, 0); lcd.print("millivolt");
lcd.setCursor(0, 0); lcd.print(spannung);
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" geladen ");
zw1 = 0; zw2 = 0; zw3 = 0; puls_aus = 0;// löschen Zählwerte
analogWrite(puls_port, puls_aus); // Abschalten Regeltransistor
do {
if (digitalRead(tast6) == 0 || digitalRead(tast12) == 0 ) {
zw1 = 1;
};
spannung_messen();
} while (zw1 == 0);
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
}
// Unterprogramme ---------------------------------------------------
void spannung_messen ()
{
spannung = 0; zw2 = 0;
do {
spannung1 = analogRead(m_spannung); delay(10);
spannung = spannung + spannung1;
zw2++;
} while (zw2 < 100);
spannung = spannung / 100;
spannung = spannung * korektur_v; spannung = spannung / 100000;
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(6, 0); lcd.print("millivolt");
lcd.setCursor(0, 0); lcd.print(spannung);
}
void spannung_strom_messen ()
{
strom = 0; strom1 = 0;
spannung = 0; zw2 = 0;
do {
strom1 = analogRead(m_strom);
strom = strom + strom1;
spannung1 = analogRead(m_spannung);
spannung = spannung + spannung1;
zw2++;
} while (zw2 < 5000);
spannung = spannung / 5000;
spannung = spannung * korektur_v; spannung = spannung / 100000;
strom = strom / 5000;
strom = strom * korektur_a; strom = strom / 100000; strom2 = strom;
strom = strom - spannung;
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(6, 0); lcd.print("millivolt");
lcd.setCursor(0, 0); lcd.print(spannung);
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(6, 1); lcd.print("milliamper");
lcd.setCursor(0, 1); lcd.print(strom);
//delay(200);
}
// HUK 11.06.2020 V24-kombi