Da mache ich jetzt 5000 Messungen für ein Ergebniss. Und der Programmteil, der den IR-Code dann an den Fernseher sendet, kommt nicht mehr nach einer bestimmten Zeit, sondern immer einmal direkt, am Ende der 5000 Messungen, was etwa nach 700 Millisekunden der Fall ist. Vorher waren diese beiden Vorgänge voneinander abgekoppelt. Also der Durchschnitt aus 5000 Messungen, ist das Ergebnis einer Lautstärkemessung, und das ist dann auch direkt das Ergebnis, für plus, minus IR-Code senden, oder für gleichbleibende Lautstärke.
Und ich habe heute noch den Entladewiderstand am Kondensator des Micro-Ausganges, von 1MOhm auf 390kOhm runtergesetz, um einen fehlenden Lautstärke-Pegel, schneller erkennen zu können. So sinkt der Pegel werend einem Messdurchgang auf annähnernd Null, wenn kein Ton mehr vorhanden ist. Das ist wichtig, dass der Null-Pegel schnelle erkennt wird, und die Lautstärke nicht unnötig erhöht wird, wenn gar kein Ton mehr vorhanden ist. Also der Pegel unter Minimalwert ist.
Und jetzt gehe ich pennen.

Code: Alles auswählen
/* Programm zum Servostrom messen
So kann man die max. Stromanforderung eines Servos rausfinden
Der Servo sollte eine eigene, genügend starke Spannungsversorgung haben,
dass er auch wirklich den Strom ziehen kann, den er benötigt.
Die Neustart Taste setzt slle Werte zurück,
und die Messung startet neu.
Fernseh_Lautstaerke_V05.2_30.04.23
*/
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x3F, 20, 4); // 0x3F oder 0x27
//-------------------------IR-Sender---------------------------------
#include <Arduino.h>
#include "PinDefinitionsAndMore.h" // Makros für Input- und Output-Pin definieren etc.
#include <IRremote.hpp>
uint8_t sCommand = 0x10; // für Volumen + / Oder "0x11" für Volumen -
uint8_t sRepeats = 2; // Code 2x wiederholen
//----------------------Micro Eingang-------------------------------
const byte ANALOG_PIN = A0; // Hier wird der Name vom Messeingang festgelegt
// Grundlage ist SimpleSender
// IR Sender RC5 minimalisiert für Fernsehsteuerung IR-Pin. ist Pin.3
// -------Einstellungen für Programm--------------------------------
int max1 = 0;// Ausgelesener Analogwert vom Micro Durchschnitt aus 2500 Messungen
int aktuell = 0;
int sollwert = 50; //Soll-Lautstärke
unsigned long max2 = 0; // Der Speicher für den Max-Sammelwert vom ADC
int zaehler = 0;
int tolleranz = 10;
int mindestpegel = 20;
int messdurchgaenge = 5000; // Jede Messung ist der Durchschnitt aus 5000 Messungen in ~1050ms
byte messungEnde = 0;
//----------------Sonderzeichen-------------------
#define OHM "\xF4" // Zeichen für Ohm
#define AE "\xE1" // Zeichen für "ä"
#define OE "\xEF" // Zeichen für "ö"
#define SS "\xE2" // Zeichen für "ß"
#define OBEN "\x5E" // Zeichen für "hoch"
#define RECHTS "\176" // Pfeil nach rechts
#define LINKS "\177" // Pfeil nach links
#define UE "\365" // Zeichen für "ü"
#define GRAD "\337C" // Zeichen für "Grad" Celsius
//------------------------------------------------
//-----------------------Taster01--------------------------------------
// const byte ist im Programm Constant und byte ist fuer Werte 0-255
const byte Taster01 = 11; // Pin 15 wird Constant als Taster01 bezeichnet
byte Tasterstatus01 = 0; // Zum Abfragen des Tatsenpins
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster02 50ms aussetzen
const unsigned long Pausezeit01 = 300;
//-----------------------Taster02--------------------------------------
const byte Taster02 = 10; // Pin16 wird Constant als Taster02 bezeichnet
byte Tasterstatus02 = 0;
unsigned long Sekundenablauf02 = 0; // Tastenabfrage von Taster02 50ms aussetzen
const unsigned long Pausezeit02 = 300;
//------------------------IR-Sender------------------------------------
byte senden = 0; // Sendekontrolle 0=Nichts, 1=Volumen+, 2=Volumen-
unsigned long Sekundenablauf03 = 0; // IR-Sender 3 Sekunden aussetzen
const unsigned long Pausezeit03 = 3000;
//----------------------LCD Beleuchtung-------------------------------
unsigned long Sekundenablauf04 = 0; // Displayzeit 3 Min. hell
const unsigned long Pausezeit04 = 60000 * 3UL;
//=====================================================================
void setup(void)
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
IrSender.begin(DISABLE_LED_FEEDBACK);
lcd.begin();
lcd.backlight();
lcd.clear();
Sekundenablauf04 = millis(); // 3 Minuten Display hell neu starten
lcd.setCursor (0, 2);
lcd.print (F("Sollwert ="));
lcd.setCursor (12, 2);
lcd.print (sollwert);
lcd.setCursor (0, 3);
lcd.print (F("Messwert ="));
lcd.setCursor (0, 1);
lcd.print (F("===================="));
lcd.setCursor (0, 0);
lcd.print (F("Lautst"AE"rke Kontrolle"));
//-----------Taster einrichten----------------------------------------
// Taster werden intern auf plus gelegt. Mit GND ueber Taste aktivieren
pinMode(Taster01, INPUT_PULLUP); // Pin 10 fuer Taster01
pinMode(Taster02, INPUT_PULLUP); // Pin 11 fuer Taster02
}
//=====================================================================
void loop(void) {
//-----------Taster01 abfragen----------------------------------------
if (millis() - Sekundenablauf01 >= Pausezeit01) { // 300msec abgelaufen?
Tasterstatus01 = digitalRead(Taster01); // Pin von Taster01 abfragen
if (Tasterstatus01 == LOW) { // Ist Taster01 gedrueckt?
Sekundenablauf01 = millis(); // Die 100ms neu starten
sollwert = sollwert - 1;
lcd.setCursor (12, 2);
lcd.print (" ");
lcd.setCursor (12, 2);
lcd.print (sollwert);
// 3 Minuten Display hell neu starten
lcd.backlight();
Sekundenablauf04 = millis();
}
}
//-----------Taster02 abfragen----------------------------------------
if (millis() - Sekundenablauf02 >= Pausezeit02) { // 300msec abgelaufen?
Tasterstatus02 = digitalRead(Taster02); // Pin von Taster02 abfragen
if (Tasterstatus02 == LOW) { // Ist Taster02 gedrueckt?
Sekundenablauf02 = millis(); // Die 100ms neu starten
sollwert = sollwert + 1;
lcd.setCursor (12, 2);
lcd.print (" ");
lcd.setCursor (12, 2);
lcd.print (sollwert);
// 3 Minuten Display hell neu starten
lcd.backlight();
Sekundenablauf04 = millis();
}
}
//---------------------------Display 10 Minuten ?----------------------
if (millis() - Sekundenablauf04 >= Pausezeit04) // 10 Min. abgelaufen?
{
lcd.noBacklight(); // Displaybeleuchtung aus
}
//------------ 2500 Durchläufe sind eine Messung -----------------
//---------------------------------- Messung ---------------------
max1 = analogRead (ANALOG_PIN); // Analogen Eingang A0 auslesen
zaehler++;
max2 = max2 + max1;
if (zaehler == messdurchgaenge)
{
aktuell = max2 / messdurchgaenge;
lcd.setCursor (12, 3);
lcd.print (F(" "));
lcd.setCursor (12, 3);
lcd.print (aktuell);
//-------------auf Minus testen-------------------------------
if ((sollwert + tolleranz) <= aktuell)
{
lcd.setCursor (18, 2);
lcd.print (F("-"));
sRepeats = 2; // Code 2x wiederholen
senden = 2; // Sende IR-Code 0x11 Volumen-
}
if ((sollwert + tolleranz) <= aktuell - 10)
{
sRepeats = 3; // Code 3x wiederholen
// 3 Minuten Display hell neu starten
lcd.backlight();
Sekundenablauf04 = millis();
}
//-------------auf Plus testen--------------------------------
if ((sollwert - tolleranz) >= aktuell)
{
lcd.setCursor (18, 2);
lcd.print (F("+"));
sRepeats = 2; // Code 2x wiederholen
senden = 1; // Sende einmal IR-Code 0x10 Volumen+
}
if ((sollwert - tolleranz) >= aktuell + 10)
{
sRepeats = 3; // Code 3x wiederholen
// 3 Minuten Display hell neu starten
lcd.backlight();
Sekundenablauf04 = millis();
}
//-----------testen ob innerhalb der Tolleranz----------------
if (sollwert <= (aktuell + tolleranz) && (sollwert >= (aktuell - tolleranz)))
{
lcd.setCursor (18, 2);
lcd.print (F("#"));
senden = 0; // Senden beenden
}
//----------------testen auf Tonpausen------------------------
zaehler = 0;
max2 = 0;
// Pegel nicht erhöhen, wenn die Lautstärke gerade total leise ist
if ((senden == 1) && (aktuell < mindestpegel))
{
senden = 0;
lcd.setCursor (18, 2);
lcd.print (F("#"));
}
messungEnde = 1;
}
// ------------------IR-Sender------------------------------------
if (messungEnde == 1)
{
if (senden == 1) //ist Pegel zu leise?
{
sCommand = 0x10; // für Volumen + / Oder "0x11" für Volumen -
IrSender.sendRC5(0x1, sCommand, sRepeats);
senden = 0;
delay(25);
Sekundenablauf03 = millis();
}
if (senden == 2) //ist Pegel zu laut?
{
sCommand = 0x11; // für Volumen - / Oder "0x10" für Volumen +
IrSender.sendRC5(0x1, sCommand, sRepeats);
senden = 0;
delay(25);
messungEnde = 0;
}
}
}
.