Anfänger Frage zu Füllstandssensor Programmierung

Hallo zusammen,

vorab ich bin absolut neu und echt unerfahren was programmieren angeht...

Habe folgendes vor...

Bei einer Pelletheizung ist ein Pufferspeicher für Pellets vorhanden. Zusätzlich habe ich einen 2. großen Puffer gebaut indem ein Saugsystem integriert ist um von dem großen Puffer in den kleinen zu saugen...

Nun die Arduino Idee...

Ich habe 2 kapazitive Sensoren, einen arduino uno, ein 24v netzteil und 2x Relais für 24v und 1 relais für 230v.

Ich würde gerne folgendes machen:

1x Kapazitiver Sensor an dem kleinen Behälter oben anbringen als MAX Füllstand
1x Kapazitiver Sensor an dem kleinen Behälter unten anbringen als MIN Füllstand

An dem 230v Relais würde ich gerne den Sauger anbinden.

Es sollte so funktionieren, dass

wenn MAX Füllstand HIGH Sauger aus
wenn MAX Füllstand LOW Sauger aus
wenn MIN Füllstand HIGH Sauger aus
wenn MIN Füllstand LOW Sauger ein bis MAX Füllstand HIGH

kann mir hier bitte jemand helfen?

Vielen Dank für alle produktiven Hilfen

Was bitte soll denn der "kapazitive Sensor" bewirken ?
Und dann solltest du auch deine verwendeten Teile mittels Hyperlinks hier vorstellen.
Wir können doch nicht wissen, was du verwendest.

Hi

Die mittleren zwei Zustände brauchst Du nicht überprüfen, da Da eh keine Reaktion geplant ist.
Somit verbleiben:

  • MAX Füllstand HIGH - Sauger AUS
  • MIN Füllstand LOW - Sauger AN

Für diese Funktionalität wäre kein µC nötig, weitere Funktionen integrieren kann man aber ja immer noch.

Der Arduino-Pin wird das Relais ggf. nicht selber treiben können - hast Du Links (klickbar) zu Deinen Bauteilen?

Du kannst aber noch eine Fehlerbehandlung einbauen - wenn der MAX-Fullstand voll meldet, kann der MIN-Füllstand kein leer melden - also Zustände, Die sich gegenseitig ausschließen, sollte man dazu nutzen, die Anlage abzuschalten, damit das Wohnzimmer nicht in Pellets versinkt.

@HotSystems
Entweder BERUs, oder anderweitig, kapazitiv arbeitende Schalter.
Wenn im Erfassungsbereich 'egal was' liegt, ändert sich ein Wert im Schalter und der Ausgang wird aktiv geschaltet.
Apropos - Da war noch der Versuch, ob sich kapazitiv Bier in einem Glasrohr (aka Flasche) detektieren lässt ...

MfG

Die kapazitiven Sensoren ob sich Pellets auf deren Höhe befindet oder nicht.
[

Das 230V Relais wäre das hier
[

](https://www.amazon.de/gp/product/B01G1ENSTS/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)](Kapazitive Näherungssensoren | CM | SICK)

postmaster-ino:
.....
@HotSystems
Entweder BERUs, oder anderweitig, kapazitiv arbeitende Schalter.
.....

Das mag ja sein. Nur Wenn der TO keine Angaben macht, woher sollen wir das wissen ?
Es gibt hunderte davon.

Hier die Sensoren

und wie baut man dann die Programmierung auf?

Hi

deinhellig:
Die kapazitiven Sensoren ob sich Pellets auf deren Höhe befindet oder nicht.
Beru

Das 230V Relais wäre das hier
Relais

Habe die URL-Tags mal etwas zusammen gebogen.

MfG

deinhellig:
....
und wie baut man dann die Programmierung auf?

Zum programmieren verwendest du am Besten die IDE.
Damit du dich an die Programmierung rantastest, kannst du ja zuvor die Beispiele der IDE verwenden und eine Tasterabfrage aufbauen, sowie eine oder mehr Leds zum Leuchten bringen.
Diese Versuche kannst du später zu deinem endgültigen Sketch erweitern.

Da kommen dann sicher noch Fragen.

Aber ganz wichtig ist für dich und für uns zum Verständnis, zeichne ein Schaltbild deines Projektes, damit wir auch verstehen wie dein Projekt funktionieren soll.

Hätte nicht gedacht daß ein kapazitiver Sensor isolierende Teile detektieren kann, aber die zitierten Sensoren scheinen das zu können.

Ich finde die Relaisplatine eine Zumutung.
Sie hat zwar Aussparungen um die Kontaktseite ordentlich von der Ansteuerseite zu trennen (ist löblich) aber keinerlei Befestigungslöcher oder andere Möglichkeiten sie sicher und isoliert zu befestigen.

Durch eine Arduino-Intelligenz können einige Sicherheitsfunktionen eingebaut werden wie Kontrolle der Füllzeit (kleiner Tank muß innerhalb x Minuten von low nach full wechseln), Zeit zwischen 2 Füllungen (der Ofen verbrennt eine Füllung in x Stunden. Da ist bei einer Auffüllung alle 10 Minuten etwas faul.

Zu klären ist ob ein Umbau der Anlage zulässig ist oder ob man einen Versicherungsschutz reskiert falls mal was (auch nicht kausal von dem Umbau abhängig) passiert.
Als Nichtbundesdeutscher bin ich mit den bundesdeutschen Gesetzen nicht vertraut.

Grüße Uwe

Hey habe nun mal ein Programm verfasst... es funktioniert aber nicht so wie es soll.

// These constants won't change:
const int ledPin = 13;       // später (3) um Relais für Staubsauger anzusteuern
int fillmin = 2;   // Füllstand min
int fillmax = 3; // Füllstand max

void setup() {
 // initialize the LED pin as an output:
 pinMode(ledPin, OUTPUT);
 pinMode(fillmin, INPUT);
 pinMode(fillmax, INPUT);
 // initialize serial communications:
 Serial.begin(9600);
}

void loop() {
 // read the state of the Sensors:
 fillmin = digitalRead(fillmin);
 fillmax = digitalRead(fillmax);


 // if fillmin is low, turn on the LED:
 if (fillmin == LOW && fillmax == LOW) {
   digitalWrite(ledPin, LOW);
 } else {
   digitalWrite(ledPin, HIGH);
 }{
   if (fillmax == HIGH)
   digitalWrite(ledPin, LOW);
 }


 // print the digital value:
 Serial.println(fillmin);
 delay(1);        // delay in between reads for stability
}

Kann mir hier jemand helfen?
Als nächster Schritt wäre dann die Sicherheitsabfrage einzubinden.
Soll man das alles über eine StateMaschine machen? Wenn ja kann mir hier jemand helfen?

hier noch der Ablaus was wie funktionieren soll.

//Pelletfüllstandsmessung

Mögliche Situationen:

Case 1: Füllstandssensor MAX inaktiv & Füllstandssensor MIN aktiv // Sauger aus
Case 2: Füllstandssensor MIN inaktiv // Sauger an bis MAX aktiv, zusätzlich Zeitbegrenzung von xxx sek.
Case 3: Füllstandssensor MIN aktiv und Zeit abgelaufen und MAX inaktiv // Timer abgelaufen und MAX Füllstand nicht erreicht, dann Störung

was muss angesteuert bzw. abgefragt werden:

Abfrage:

  • Digital 0 // Optokoppler Füllstand MAX
  • Digital 1 // Optokoppler Füllstand MIN

Ansteuerung:

  • Digital 3 // Relais angesteuert mit 5V

Ablauf:

Wenn Füllstand MIN inaktiv ( Digital 1 kein Signal ) Digital 3 aktiv setzen, bis Füllstand MAX ( Digital 0 ) aktiv, oder max definierte Zeit
abgelaufen, dann Digital 3 inaktiv. Wenn Zeit abgelaufen und MAX inaktiv Störung ausgeben und Steuerung stoppen bis reset...

Optionale Funktionen wenn Rest funktioniert:

  • LCD Display einbinden und aktuellen Status anzeigen ( Betrieb / Störung )
  • Wenn Störung Datum und Uhrzeit auf Display anzeigen
  • Wlan fähig machen und wenn Störung Nachricht senden

Setze Deinen Sketch bitte in Codetags (Der </>-Button oben links im Forumseditor).
Dann solltest Du uns auch noch mitteilen, was wie funktioniert/nicht funktioniert und wie es denn nach Deiner Meinung funktionieren sollte.

Gruß Tommy

// These constants won't change:
const int ledPin = 13;       // später (3) um Relais für Staubsauger anzusteuern
int fillmin = 2;   // Füllstand min
int fillmax = 3; // Füllstand max

void setup() {
 // initialize the LED pin as an output:
 pinMode(ledPin, OUTPUT);
 pinMode(fillmin, INPUT);
 pinMode(fillmax, INPUT);
 // initialize serial communications:
 Serial.begin(9600);
}

void loop() {
 // read the state of the Sensors:
 fillmin = digitalRead(fillmin);
 fillmax = digitalRead(fillmax);


 // if fillmin is low, turn on the LED:
 if (fillmin == LOW && fillmax == LOW) {
   digitalWrite(ledPin, LOW);
 } else {
   digitalWrite(ledPin, HIGH);
 }{
   if (fillmax == HIGH)
   digitalWrite(ledPin, LOW);
 }


 // print the digital value:
 Serial.println(fillmin);
 delay(1);        // delay in between reads for stability
}

//Pelletfüllstandsmessung

Mögliche Situationen:

Case 1: Füllstandssensor MAX inaktiv & Füllstandssensor MIN aktiv // Sauger aus
Case 2: Füllstandssensor MIN inaktiv // Sauger an bis MAX aktiv, zusätzlich Zeitbegrenzung von xxx sek.
Case 3: Füllstandssensor MIN aktiv und Zeit abgelaufen und MAX inaktiv // Timer abgelaufen und MAX Füllstand nicht erreicht, dann Störung

was muss angesteuert bzw. abgefragt werden:

Abfrage:

  • Digital 0 // Optokoppler Füllstand MAX
  • Digital 1 // Optokoppler Füllstand MIN

Ansteuerung:

  • Digital 3 // Relais angesteuert mit 5V

Ablauf:

Wenn Füllstand MIN inaktiv ( Digital 1 kein Signal ) Digital 3 aktiv setzen, bis Füllstand MAX ( Digital 0 ) aktiv, oder max definierte Zeit
abgelaufen, dann Digital 3 inaktiv. Wenn Zeit abgelaufen und MAX inaktiv Störung ausgeben und Steuerung stoppen bis reset...

Optionale Funktionen wenn Rest funktioniert:

  • LCD Display einbinden und aktuellen Status anzeigen ( Betrieb / Störung )
  • Wenn Störung Datum und Uhrzeit auf Display anzeigen
  • Wlan fähig machen und wenn Störung Nachricht senden

fillmin = digitalRead(fillmin);

Damit wirst du nie glücklich werden!

Das hast du hoffentlich falsch abgeschrieben, und die Kommentare zwar abgetippt, aber ignoriert.

Wenn du es dir selbst ausgedacht hast:

    int status = digitalRead(pin);

Dabei ist pin eine (üblicherweise konstante Pin-Nummer ( z.B. als const int pin=2; definiert )
und status ist das Ergebnis des Auslesens: HIGH oder LOW.

Hi

Sofern die Pin-Nummer nicht negativ werden können, kann man auch unsigned int schreiben.
Wenn's aber maximal 256 Beinchen sind, reicht auch der Datentyp byte.
const wurde ja bereits erwähnt - spart Speicher, da dann der Wert fest im Programm eingetragen wird.
Somit ist dann der Datentyp bei const wohl egal, da der 'Platz' nie benötigt wird und die Zahl direkt im Code landet.
... so kann man doch bei int bleiben - wieder was gelernt.

MfG

@postmaster:
Natürlich wäre

const byte maxPin=3;

noch richtiger :wink: aber das int/byte bringt dann schon der Compiler in Ordnung.
Nah am gegebenen Text bleiben, wenn nichts dagegen spricht, erleichtert auch die Akzeptanz.

So habe jetzt mal ein bisschen was erarbeitet... jetzt würde ich gerne noch einen timer interrupt einbinden,
sodass nach einer maximalen "Pelletsauger an " Zeit ( z.B. 600 sekunden) eine automatische Abschaltung von diesem erfolgt.

int stand_max_pin = 2;
int stand_min_pin = 3;
int out_pin = 4;

void setup(){
  pinMode(stand_max_pin, INPUT); // Füllstandssensor max
  pinMode(stand_min_pin, INPUT); // Füllstandssensor min
  pinMode(out_pin, OUTPUT);  // Pelletsauger 
  Serial.begin(9600);
  Timer1.initialize(100000);
}
void standabfrage(){
  int max_state = digitalRead(stand_max_pin);
  int min_state = digitalRead(stand_min_pin);
  if (max_state == 1){
    digitalWrite(out_pin, LOW); // Pelletsauger aus wenn Füllstandssensor max aktiv
  }
  if (min_state == 0){
    digitalWrite(out_pin, HIGH); // Pelletsauger ein wenn Füllstandssensor min inaktiv
  }
  else{
    Serial.print("MIN Status ist erreicht");
    digitalWrite(out_pin, HIGH);
  }
}
void security(){  // wenn Füllstandssenor max aktiv und Füllstandssensor min inaktiv ( nicht möglich, ausser verdreckt ) dann Sicherheitsabschaltung
  int max_state = digitalRead(stand_max_pin);
  int min_state = digitalRead(stand_min_pin);
  if (max_state == 1 | min_state == 0){
    Serial.print("ERROR!");
    digitalWrite(out_pin, LOW); 
  }
  else{
    standabfrage();
  }
}
void loop (){
  security();
}

Kann mir hier jemand helfen?

Hi

Wieso Interrupt?
Merke Dir die 'Uhrzeit', wenn der Sauger ANgeschaltet wird und prüfe dauernd, ob Dieser noch läuft und die maximale Laufzeit überschritten ist.

millis() bietet sich dafür an, wie ein weiterer Merker, Der den Motorstatus beinhaltet - boolean reicht hierfür.

MfG

So hab das hier jetzt mal probiert, aber irgendwie funktioniert es nicht, bekomme die ganze zeit Error

int stand_max_pin = 2;
int stand_min_pin = 3;
int out_pin = 4;
int led_green = 5;
int led_red = 6;

//boolean out_pin = HIGH; //Startwert Pelletsauger
//unsigned long previousMillis = 0; //speichert wie viele Sekunden seit der letzten Änderung vergangen sind

int minuten = 0.2; //Intervall in Minuten

unsigned long lastmammalon;

unsigned long interval = minuten* 60 *1000UL; //dauer intervall in Millisekunden

void setup(){
  pinMode(stand_max_pin, INPUT); // Füllstandssensor max
  pinMode(stand_min_pin, INPUT); // Füllstandssensor min
  pinMode(out_pin, OUTPUT);  // Pelletsauger 
  pinMode(led_green, OUTPUT); // Grüne LED
  pinMode(led_red, OUTPUT); // Rote LED
  Serial.begin(9600);
}
void standabfrage(){
  int max_state = digitalRead(stand_max_pin);
  int min_state = digitalRead(stand_min_pin);
  if (max_state == 1){
    digitalWrite(out_pin, LOW); // Pelletsauger aus wenn Füllstandssensor max aktiv
  }
  if (min_state == 0){
    digitalWrite(out_pin, HIGH); // Pelletsauger ein wenn Füllstandssensor min inaktiv
    digitalWrite(led_green,HIGH); // grüne LED um anzuzeigen ob Sauger aktiv
  }
  else{
    Serial.print("MIN Status ist erreicht");
    digitalWrite(out_pin, HIGH);
    digitalWrite(led_green,HIGH);   // grüne LED um anzuzeigen ob Sauger aktiv
  }
  if (digitalRead(out_pin) == HIGH)
  {
    lastmammalon = millis();
  }
  // Sicherheitsabschaltung nach XX Minuten

  if(millis() - lastmammalon > interval)
  {
    digitalWrite(out_pin, LOW);
    digitalWrite(led_red, HIGH);
    delay(1000);
    Serial.print("max Füllzeit erreicht!");
    lastmammalon = millis();
  }
}
void security(){  // wenn Füllstandssenor max aktiv und Füllstandssensor min inaktiv ( nicht möglich, ausser verdreckt ) dann Sicherheitsabschaltung
  int max_state = digitalRead(stand_max_pin);
  int min_state = digitalRead(stand_min_pin);
  if (max_state == 1 | min_state == 0){
    Serial.print("ERROR!");
    digitalWrite(out_pin, LOW); 
  }
  else{
    standabfrage();
  }
}
void loop (){
  security();
}

deinhellig:
So hab das hier jetzt mal probiert, aber irgendwie funktioniert es nicht, bekomme die ganze zeit Error

//wenn Füllstandssenor max aktiv und Füllstandssensor min inaktiv ( nicht möglich, ausser verdreckt ) dann Sicherheitsabschaltung

if (max_state == 1 | min_state == 0){
}

Müsste es dann nicht heißen:

if (max_state == 1 && min_state == 0){

Hi

deinhellig:
So hab das hier jetzt mal probiert, aber irgendwie funktioniert es nicht, bekomme die ganze zeit Error

Eine durchaus interessante Meldung - leider ohne irgend einen Hauch an Informationsgehalt.

Wie meinen?
Was für einen Fehler?
Vll. sogar direkt mit der vom Compiler ausgegebenen Meldung?
Wenn eine Sketch-interne-Meldung - Welche? (nein, habe mir den Sketch nicht angeschaut, ob Dieser einen Fehler anzeigen kann)

MfG