Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Ich habe nochmal die Richtung geändert, bei der Messung des Lautstärke Pegels. Durch den Kondensator zwischen GND und dem Micro-Ausgang habe ich zwar eine etwas stabilere Messbasis, die nicht soooo zappelt, aber ich habe Probleme bei der Reglung. Hier mal eine Situation bei der ich Probleme habe. Die Lautstärke wird gemessen, der Fernseher ist z.B. auf Stufe 13 in der Lautstärke. Jetzt kommt eine Szene, in der kein Ton mitkommt. Das Micro hört nichts, aber der Kondensator lässt nur langsam nach. Das Gerät sagt aber es wird leiser, und es gibt dem Volumen Gas, also Lautstärke plus. Die Pause hält weiter an, jede Sekunde gibt das Gerät dem Fernseher Volumen plus. Kein Problem, der Fernseher wird trotzdem nicht lauter, weil ja in dieser Phase gerade kein Ton ist. Aber dann, kommt wieder ein Ton, und dadurch, dass der Ton immer lauter geregelt wurde, setzt der Fernseher mit Gebrüll wieder ein. OK, dann regelt die Steuerung natürlich wieder runter, aber auch wieder jede Sekunde eine Stufe runter. Bis der Fernseher wieder die richtige, verträgliche Lautstärke hat, sind mir die Ohren abgefallen. :agt:

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. :(oo): ......und bei welcher Situation es dann wieder Probleme gibt. Wir werden sehen. :(o): :(o):

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. :sad:

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();
    }
  }
}
Und noch die geänderte Schaltung:
.
Fernseher Lautstärke Steuerung_V02.JPG
Fernseher Lautstärke Steuerung_V02.JPG (212.95 KiB) 616 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Bin im Moment zufrieden. Ich habe mir jetzt noch dyn. Microfonkapseln bestellt mit denen ich hoffentlich die Micro-Verstärker auch brauchbar zum laufen bringe. Dauert aber 14 Tage, bis die kommen. Vielleicht schaue ich mir noch die Micro-Baugruppen für die Arduinos an.

Franz

Noch kleine Software Änderungen:

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_V03_15.04.23
*/

#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
unsigned long max2 = 0;   // Der Speicher für den Max-Sammelwert vom ADC
int zaehler = 0;
int tolleranz = 10;
int mindestpegel = 38;
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 Volumen-
    }
    if ((sollwert - tolleranz) >= aktuell)
    {
      lcd.setCursor (18, 2);
      lcd.print (F("+"));
      senden = 1; // Sende einmal IR-Code 0x10 Volumen+
    }
    if (sollwert <= ((aktuell + (tolleranz - 1))) && (sollwert >= (aktuell - (tolleranz - 1))))
    {
      lcd.setCursor (18, 2);
      lcd.print (F("#"));
      senden = 0; // Senden beenden
    }
    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("#"));
    }
  }
  // ------------------IR-Sender------------------------------------
  if (millis() - Sekundenablauf03 >= Pausezeit03)  // 1000msec abgelaufen?
  {

    if (senden == 1)
    {
      sRepeats = 2; // Code 2x wiederholen
      sCommand = 0x10; // für Volumen + / Oder "0x11" für Volumen -
      IrSender.sendRC5(0x1, sCommand, sRepeats);
      senden = 0;
      delay(25);
      Sekundenablauf03 = millis();
    }
    if (senden == 2)
    {
      sRepeats = 3; // Code 3x wiederholen für schnelleres Volumen -
      sCommand = 0x11; // für Volumen - / Oder "0x10" für Volumen +
      IrSender.sendRC5(0x1, sCommand, sRepeats);
      senden = 0;
      delay(25);
      Sekundenablauf03 = millis();
    }
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Schade!!
Ich werde lagsam aber sicher immer mehr Sauer auf AZ-Delivery!!

Immer wieder wird man im Verkaufstext nicht, oder gar falsch informiert wie in dem Fall wieder. Im Verkaufstext ist die Versorgungsspannung mit 2,7 - 5,5 Volt angegeben. Im PDF Anschlussplan steht aber dann 3,3 Volt. Diese miesen Zecken machen das immer öfter. Endweder sie schreiben im Verkaufstext NICHTS über die Betriebsspannung, was einen annehmen lässt dass 3,3 und 5 Volt passt. Aber weit gefehlt. Wenn nichts dabei steht sollten man seit einiger Zeit wohl besser davon ausgehen, dass es nur 3,3 Volt sind. Ich verstehe nicht, warum die den Käufer immer öfter verarschen. Die Reaktion ist doch, jedenfalls bei mir, dass man immer mehr Abstand nimmt, von Anbietern mit solch miesen Methoden. Man kauft einmal falsch, weil man verarscht wurde, noch ein zweites mal, vielleicht noch ein drittes mal. Aber das war dann einmal zuviel, und man kauft nichts mehr von denen. Was bringt es also, wenn sie 1-2x ihren Müll beim Kunden abkippen können, dann aber für immer der Ofen aus ist???

Hier auf der Verkaufsseite von denen steht Spannungsversorgung 2,7 bis 5,5 Volt!!
Max9814_AZ_Delivery.jpg
Max9814_AZ_Delivery.jpg (326.77 KiB) 590 mal betrachtet
Hier die PDF Datei von denen. Da steht ausdrücklich 3.3 Volt!!
MAX9814_Anschlussplan.jpg
MAX9814_Anschlussplan.jpg (322.02 KiB) 589 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

OK, ich habe jetzt mal das neue V-Micro angeschossen. Die 3,3Volt gefallen mir nicht, weil man da immer so aufpassen muss, dass man nicht aus Versehen 5 Volt reinjagt, aber OK. Ich möchte das morgen nochmal ein wenig testen, weil ich in der Nacht die Lautstärke nicht so aufdrehen kann, sonst Köpft mich meine Familie. Aber ich glaube, dass ich es so lassen kann. Ich hänge daher mal die neue Schaltung hier dran. Das Programm mußte ich nicht nicht ändern, aber kann morgen noch passieren. Man bracht damit keine 12Volt mehr, somit auch keinen DC/DC Wandler von 12 auf 5 Volt. Nur noch ein 5Volt Netzteil.
.
Fernseher Lautstärke Steuerung_V03.JPG
Fernseher Lautstärke Steuerung_V03.JPG (190.17 KiB) 566 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Ich habe jetzt auch in meinem Gerät das V-Micro gegen dieses Max9814 getauscht und meinen alten Verstärker in den Müll geschmissen. Bei dem alten brachte ich den Pegel nicht auf nahe Null, sondern zwischen 20 und 30 war Ende Gelände. Das Grundrauschen war einfach zu groß, wenn man ihn voll aufdrehte. Und die Max 9814 gehen auf Null, wenn da nichts ist. Ausserdem braucht man die Diode nicht, weil da schon DC Analog am Ausgang ist. Und die benötigten 3,3 Volt nehme ich eben am Uno ab.

Das Programm habe ich noch ein wenig nachjustiert, so wie ich es jetzt hier unten reinstelle, gefällt es mir im Moment.

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_V03.2_22.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 neu = 0; // Übernommen aus max1
int alt = 0; // Wert der Vorhergehenden Messung
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 = 10;
int messdurchgaenge = 5000; // 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 Volumen-
    }
    if ((sollwert - tolleranz) >= aktuell)
    {
      lcd.setCursor (18, 2);
      lcd.print (F("+"));
      senden = 1; // Sende einmal IR-Code 0x10 Volumen+
    }
    if (sollwert <= ((aktuell + (tolleranz))) && (sollwert >= (aktuell - (tolleranz))))
    {
      lcd.setCursor (18, 2);
      lcd.print (F("#"));
      senden = 0; // Senden beenden
    }
    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("#"));
    }
  }
  // ------------------IR-Sender------------------------------------
  if (millis() - Sekundenablauf03 >= Pausezeit03)  // 1000msec abgelaufen?
  {

    if (senden == 1)
    {
      sRepeats = 2; // Code 2x wiederholen
      sCommand = 0x10; // für Volumen + / Oder "0x11" für Volumen -
      IrSender.sendRC5(0x1, sCommand, sRepeats);
      senden = 0;
      delay(25);
      Sekundenablauf03 = millis();
    }
    if (senden == 2)
    {
      sRepeats = 2; // Code 2x wiederholen
      sCommand = 0x11; // für Volumen - / Oder "0x10" für Volumen +
      IrSender.sendRC5(0x1, sCommand, sRepeats);
      senden = 0;
      delay(25);
      Sekundenablauf03 = millis();
    }
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Mein Problem ist jetzt noch folgendes:
Wenn es im Raum einige Sekunden lang sehr viel Lauter wird, als die gewünschte Lautstärke, dann regelt das Gerät die Lautstärke des Fernsehers immer weiter herunter. Wenn der Lärm eine andere Quelle ist, nicht der Fernseher, dann regelt das Gerät den Fernseher runter bis null.

So, jetzt ist der Fernseher auf Null, die andere Tonquelle ist auch wieder still. Dann möchte man eigentlich dass des Gerät den Fernseher wieder hochregelt, bis die Lautstärker wieder stimmt. Das Gerät geht aber von einer Tonpause im Film aus, und lässt die Lautstärke wo sie ist. Wenn im Film gerade einige Sekunden kein Ton ist, das Gerät regelt lauter und lauter, aber der Fernseher bleibt stumm, weil ja im Film gerade kein Ton ist. Also regelt es weiter immer lauter, lauter, lauter, und wenn dann im Film wieder ein Ton kommt, fallen einem die Ohren ab, weil es jetzt extrem Laut ist.

Dass das nicht passiert habe ich einen Schutz im Programm. Wenn die Ton plötzlich kleiner 10 ist, Normal ist ewa 50, dann regelt das Gerät nicht mehr lauter, weil es annimmt, dass im Film gerade eine Tonpause ist. Ja, Arschkarte :(o): :(o): Das heißt, ich kann die Lautstärker mit der Fernsteuerung leise regeln, unter 10, dann regelt das Gerät die Laustärke nicht wieder hoch, weil es von einer Tonpause ausgeht. :(o): :(o):

Wenn ich keine bessere Lösung dafür finde, dann muss mal in dem seltenen Fall die Lautstärke wieder mit der Fernsteuerung hochziehen, dann geht es wieder ganz normal weiter. Aber ich halte mal den Kopf schief, dass das Hirn zusammen läuft, dann finde ich vielleicht eine bessere Lösung. :oo:

Ich habe da schon was, das muss noch reifen. Bei extrem leise, gleich in einem Schritt 5 Stufen lauter, und bei extrem laut, das Gegenteil, in einem Schritt 5 Stufen leiser.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Ich habe mal wieder ein paar kleine Änderungen gemacht. Wenn der Fernseher besonder laut oder leise ist, also um mehr als 20 Punkte über / unten "sollwert", dann regelt das Gerät nicht nur 1x dagegen, sondern gleich mal 4x. Und ich habe das Display bischen umgestellt. Es ist jetzt nur noch 3 Minuten beleuchtet, dann wird es dunkel. Wenn man eine Taste drückt, geht es wieder für drei Minunten an, auch wenn ein großer Lautstärkeschritt gemacht wird, geht das Display für 3 Minuten an.

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_V04.1_27.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 neu = 0; // Übernommen aus max1
int alt = 0; // Wert der Vorhergehenden Messung
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 = 10;
int messdurchgaenge = 5000; // 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;
//----------------------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) { // 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);
      // 3 Minuten Display hell neu starten
      lcd.backlight();
      Sekundenablauf04 = millis();
    }
  }
  //-----------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);
      // 3 Minuten Display hell neu starten
      lcd.backlight();
      Sekundenablauf04 = millis();
    }
  }
  //---------------------------Display 10 Minuten ?----------------------
  if (millis() - Sekundenablauf04 >= Pausezeit04)  // 10 Min. abgelaufen?
  {
    lcd.noBacklight();   // Displaybeleuchtung aus
  }
  //------------ 5000 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);
    //-------------auf Minus testen-------------------------------
    if ((sollwert + tolleranz) <= aktuell)
    {
      lcd.setCursor (18, 2);
      lcd.print (F("-"));
      sRepeats = 2; // Code 2x wiederholen
      senden = 2; // Sende einmal IR-Code 0x11 Volumen-
    }
    if ((sollwert + tolleranz) <= aktuell - 10)
    {
      sRepeats = 4; // Code 4x 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 = 4; // Code 4x 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("#"));
    }
  }
  // ------------------IR-Sender------------------------------------
  if (millis() - Sekundenablauf03 >= Pausezeit03)  // 1000msec abgelaufen?
  {

    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);
      Sekundenablauf03 = millis();
    }
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

So ich habe heute noch ein paar Dyn. Micros bekommen, um den "Mikrofon-Verstearker-RBS15405-9" den ich mal verwenden wollte, zu testen. Wer weiß wofür ich diese Micros mir dem Verstärker mal verwenden kann, aber auf keinen Fall dafür. Ich setze mal noch ein Bild dafon hier rein. Diese Kombi ist viel zu unempfindlich. Das Mikro und der Verstärker, geben das nicht her. Es bleibt also bei der zuletzt gezeigten Kombination.

Also das kann man dafür nicht verwenden!
Mikrofon-Verstearker-RBS15405-9_300x300.jpg
Mikrofon-Verstearker-RBS15405-9_300x300.jpg (15.38 KiB) 513 mal betrachtet
Es bleibt also beim Max9814. Das Ding geht super, aber denkt dran, der will 3,3 Volt als Betriebsspannung!!! .......keine 5 Volt!!!
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Ich habe heute wieder ein paar Kleinigkeiten verändert, deshalb mal ein UpDate dess Programm´s. Aber das ist nur zum Testen, falls jemand das Gerät schon nachgebaut hat. Ob das so besser ist, weiß ich noch nicht. Muss ich erst abends mal testen. Ich habe die Messdurchgänge von 5000 auf 2500 runtergesetzt. Dass der Vergleich Aktuellwert zu Sollwert doppelt so oft gemacht wird. Aber das Senden des IR-Codes zum Fernseher für lauter oder leiser, nicht mehr im Sekundentakt, sondern im 2 Sekundentakt.

PS: Stopp, das Programm hier kann man in der Pfeife rauchen!!!

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_V04.2_29.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 neu = 0; // Übernommen aus max1
int alt = 0; // Wert der Vorhergehenden Messung
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 = 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 2 Sekunden aussetzen
const unsigned long Pausezeit03 = 2000;
//----------------------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) { // 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);
      // 3 Minuten Display hell neu starten
      lcd.backlight();
      Sekundenablauf04 = millis();
    }
  }
  //-----------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);
      // 3 Minuten Display hell neu starten
      lcd.backlight();
      Sekundenablauf04 = millis();
    }
  }
  //---------------------------Display 10 Minuten ?----------------------
  if (millis() - Sekundenablauf04 >= Pausezeit04)  // 10 Min. abgelaufen?
  {
    lcd.noBacklight();   // Displaybeleuchtung aus
  }
  //------------ 5000 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);
    //-------------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 = 4; // Code 4x 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 = 4; // Code 4x 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("#"));
    }
  }
  // ------------------IR-Sender------------------------------------
  if (millis() - Sekundenablauf03 >= Pausezeit03)  // 2000msec abgelaufen?
  {

    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);
      Sekundenablauf03 = millis();
    }
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Wir ärgern uns immer mehr über störende, grasse Lautstärkeunterschiede beim Fernsehen

Beitrag von Admin »

Also ich habe es heute abend getestet mit einem Film der sehr oft grasse Lautstärkeunterschiede bringt, und was immer noch ein Problem ist, immer kurze Tonpausen, dann wieder kurzes lautes Sprechen, das immer weiter laufend nacheinander abwechselnd. So wird die Lautstärke immer weiter hoch geschaukelt. Und selten war die Sprache so lange, dass es einen Grund zum runterregeln gab. Die Sprache kurz, die Tonpausen eher lang. Dafür habe ich noch kein Rezept gefunden. Also im Moment ist das noch nichts zum nachbauen!! Ich hoffe, ich bekomme das noch hin. :sad: :???: :(o):
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 41 Gäste