Ok, deshalb habe ich umgebaut, und versuche jetzt wieder einen anderen Weg. Kein Kondensator der das Lautstärkesignal bügelt und hält. Der Messpegel geht als schnell runter. Ich bekomme alle 350ms einen neuen Pegelwert, und ich regle jede Sekunde den Lautstärkewert eine Stufe rauf oder runter. Jetzt kann ich an dem Pegel sehen, dass da gerade keiner oder fast kein Pegel vorhanden ist. Und setze deshalb das lauter Regeln aus. Also ich kriege jetzt sofort mit, dass es gerade nichts, oder fast nichts, zu hören gibt, und halte den Pegel konstant. Das ist jetzt jedenfall "meine neue Stoßrichtung". Mal schauen ob das besser funktioniert. ......und bei welcher Situation es dann wieder Probleme gibt. Wir werden sehen.
Achja, die neuen Micoverstärker sind nicht so der Hit. Mal schauen, ob es dafür bessere dynanische Micros gibt.
Hier habe ich mal das Programm ein bischen in meiner Wunschrichtung angepasst. Ist schon ganz gut, aber noch nicht so richtig passend. Ich habe in der Steuerung jetzt mal drin, wenn die Lautstärke zu leise ist, aber unterhalb "28", dann keine Erhöhung der Lautstärke. Ist aber noch nicht das gelbe vom Ei. Meine Birne ist jetzt aber mehr auf schlafen eingestellt, als auf denken.
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.
*/
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x3F, 20, 4); // 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 neu = 0; // Übernommen aus max1
int alt = 0; // Wert der Vorhergehenden Messung
int aktuell = 0;
int sollwert = 60; //Soll-Lautstärke
byte maxaktuell = 0;
unsigned long max2 = 0; // Der Speicher für den Max-Sammelwert vom ADC
int zaehler = 0;
int tolleranz = 10;
int messdurchgaenge = 2500; // Jede Messung ist der Durchschnitt aus 2500 Messungen in ~350ms
//----------------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 = 100;
//-----------------------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 = 100;
//------------------------IR-Sender------------------------------------
byte senden = 0; // Sendekontrolle 0=Nichts, 1=Volumen+, 2=Volumen-
unsigned long Sekundenablauf03 = 0; // IR-Sender 5 Sekunden aussetzen
const unsigned long Pausezeit03 = 1000;
//=====================================================================
void setup(void)
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
IrSender.begin(DISABLE_LED_FEEDBACK);
lcd.begin();
lcd.backlight();
lcd.clear();
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) { // 100msec 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);
}
}
//-----------Taster02 abfragen----------------------------------------
if (millis() - Sekundenablauf02 >= Pausezeit02) { // 100msec 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);
}
}
//------------ 2500 Durchläufe sind eine Messung -----------------
//---------------------------------- Messung ---------------------
max1 = analogRead (ANALOG_PIN); // Analogen Eingang A0 auslesen
zaehler++;
max2 = max2 + max1;
if (zaehler == messdurchgaenge)
{
neu = max2 / messdurchgaenge;
aktuell = (neu + alt) / 2;
alt = neu;
lcd.setCursor (12, 3);
lcd.print (F(" "));
lcd.setCursor (12, 3);
lcd.print (aktuell);
if ((sollwert + tolleranz) <= aktuell)
{
lcd.setCursor (18, 2);
lcd.print (F("-"));
senden = 2; // Sende einmal IR-Code 0x11
}
if ((sollwert - tolleranz) >= aktuell)
{
lcd.setCursor (18, 2);
lcd.print (F("+"));
senden = 1; // Sende einmal IR-Code 0x10
}
if (sollwert <= ((aktuell + (tolleranz - 1))) && (sollwert >= (aktuell - (tolleranz - 1))))
{
lcd.setCursor (18, 2);
lcd.print (F("#"));
senden = 0; // Senden beenden
}
zaehler = 0;
max2 = 0;
if ((senden == 1) && (aktuell < 28))
{
senden = 0;
lcd.setCursor (18, 2);
lcd.print (F("#"));
}
}
// ------------------IR-Sender------------------------------------
if (millis() - Sekundenablauf03 >= Pausezeit03) // 1000msec abgelaufen?
{
if (senden == 1)
{
uint8_t sCommand = 0x10; // für Volumen + / Oder "0x11" für Volumen -
IrSender.sendRC5(0x1, sCommand, sRepeats);
senden = 0;
delay(25);
Sekundenablauf03 = millis();
}
if (senden == 2)
{
uint8_t sCommand = 0x11; // für Volumen - / Oder "0x10" für Volumen +
IrSender.sendRC5(0x1, sCommand, sRepeats);
senden = 0;
delay(25);
Sekundenablauf03 = millis();
}
}
}
.