Der NE555 kann als Frequenzgenerator beschaltet werden. Das frequenzändernde Bauteil ist dabei ein Kondensator (im Schaltbild C2). Klebt man zwei Kupferstreifen von außen an einen Behälter, so ändert sich das Dielektrikum und damit die Kapazität, wenn der Behälter mit einer Flüssigkeit gefüllt wird.
Damit ist das Szenario klar, der Arduino darf jetzt die Frequenz zählen.
DIe Schaltung ist so aufgebaut, dass die Messtaste einfach den Strom einschaltet. Die Messung dauert dann einfach 2-3 Sekunden. Eine genaue Frequenz ist bei diesem Aufbau nicht notwendig, es genügt, wenn die Messung einen vier-stelligen Wert ausgibt. Dann kann man mit den beiden anderen Tasten die Schaltung kalibrieren. Zum einfachen Anpassen kann mit dem 1 MOhm-Widerstand “gespielt” werden. Zu niedrige Frequenz -> Widerstand niedriger, zu hohe Frequenz -> Widerstand erhöhen. Hierbei hilft der serielle Monitor.
Also: leeres Gefäß: untere Kalibrierungstaste drücken und dann die Einschalt-Taste. Wert wird im EEPROM gespeichert und die vier unteren LEDs leuchten. Dto. für den oberen Wert. Dann kann das fröhliche Messen beginnen.
Die Test-Schaltung habe ich mit einem Uno aufgebaut, für den realen Aufbau habe ich aus Platzgründen einen Nano genommen, eine 9V-Batterie und einen 7805 zur Spannungsregulierung.
Mein Einsatzzweck: ich messe die Füllhöhe meines Abwassertanks im Wohnwagen. Läuft!

// Fuellstandsmelder
// basierend auf einer Frequenzmessung am NE555
// mit 1MOhm und 150pF
//
// Quellen:
// LongInteger EEPROM schreiben / lesen:
// http://shelvin.de/long-int-zahl-im-arduino-eeprom-ablegen-und-auslesen/
// Arduino als Frequenzzähler:
// http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/index.html
// (hier gibt es auch die notwendige Library Frequcounter.h
// http://shelvin.de/frequenzzaehler-mit-dem-arduino-uno/
//
// Nano Layout:
// http://www.circuitstoday.com/arduino-nano-tutorial-pinout-schematics
//
// Taste_1 (A0) auf LOW: Programmierung für Zustand "leer"
// Taste_2 (A1) auf LOW: Programmierung für Zustand "voll"
#include <EEPROM.h>
#include <FreqCounter.h>
void setup() {
Serial.begin(38400); // Serielle Ausgabe
Serial.println("Fuellstandsmesser");
// Definition der LEDs
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
// Pin5 = Input
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
}
void loop() {
// Definition der Taster
int Taste_1 = analogRead(A0);
int Taste_2 = analogRead(A1);
int adr;
byte by;
// Taste für Programmierung "leer"
if (Taste_1 <50) {
Serial.println("Programmierung leer");
// Messreihe für leer
long int Wert_leer;
Wert_leer = freq_mess();
for (int i=0; i<=3; i++) {
Wert_leer = (Wert_leer + freq_mess()) / 2;
}
Serial.println(Wert_leer);
// Wert im EEProm ablegen
adr = 8;
for (int i=0; i<4; i++) {
by = (Wert_leer >> ((3-i)*8)) & 0x000000ff;
EEPROM.write(adr+i, by);
}
// LEDs Anzeige fertig
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(6, HIGH);
// Endlos-Loop
for (;;){
}
}
// Taste für Programmierung "voll"
if (Taste_2 <50) {
Serial.println("Programmierung voll");
// Messreihe für voll
long int Wert_voll;
Wert_voll = freq_mess();
for (int i=0; i<=3; i++) {
Wert_voll = (Wert_voll + freq_mess()) / 2;
}
Serial.println(Wert_voll);
// Wert im EEProm ablegen
adr = 16;
for (int i=0; i<4; i++) {
by = (Wert_voll >> ((3-i)*8)) & 0x000000ff;
EEPROM.write(adr+i, by);
}
// LEDs Anzeige fertig
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
// Endlos-Loop
for (;;){
}
}
// keine Taste - Wert berechnen und LEDs anzeigen
// EEProm auslesen
// Wert leer
long int Wert_leer;
adr=8;
for(int i=0;i< 3;i++){
Wert_leer += EEPROM.read(adr+i);
Wert_leer = Wert_leer << 8;
}
Wert_leer += EEPROM.read(adr+3);
// Wert voll
long int Wert_voll;
adr=16;
for(int i=0;i< 3;i++){
Wert_voll += EEPROM.read(adr+i);
Wert_voll = Wert_voll << 8;
}
Wert_voll += EEPROM.read(adr+3);
Serial.println("Leer");
Serial.println(Wert_leer);
Serial.println("Voll");
Serial.println(Wert_voll);
Serial.println("Messung");
// Vergleichsmessung 3x
long int Wert_mess;
Wert_mess = freq_mess();
for (int i=0; i<=3; i++) {
Wert_mess = (Wert_mess + freq_mess()) / 2;
}
Serial.println(Wert_mess);
// Auswerten
int Schritt = (Wert_leer - Wert_voll) / 8;
Serial.println("Schritt");
Serial.println(Schritt);
int LED[] = {2,3,4,6,7,8,9,10};
for (int i=0; i<=7; i++) {
if (Wert_mess < (Wert_leer - (i * Schritt))) {
digitalWrite(LED[i], HIGH);
}
else {
digitalWrite(LED[i], LOW);
}
}
// Endlos-Loop
for (;;) {
}
}
long int freq_mess() {
long int mfreq;
FreqCounter::f_comp= 8; // Kompensation einstellen
FreqCounter::start(100); // Zähler starten für 100ms
while (FreqCounter::f_ready == 0) // warten bis der Zähler fertig ist
mfreq=FreqCounter::f_freq; // Ergebnis lesen
return mfreq;
}