Mehrere Timer und Eingangssignal vom kapazitiven Sensor

Hallo liebes Forum!

Ich bin Azubi der sich gerade versucht seine Anfänger Kenntnisse von Logo auf Arduino aufzubessern, aber für mein aktuelles Projekt habe ich mich aber vermutlich etwas zu weit aus dem Fenster gelehnt. Ich versuche es kurz zu halten:

Ich habe einen kapazitiven Sensor (4mA-20mA) der bei Unterschreitung der bestimmten Füllmenge eine LED zum blinken bringen soll.
Ein Taster soll das Blinken Ausschalten und das Signal soll nach dem drücken 10 min lang nicht abgefragt werden. (Man braucht 10 min um den Füllstand aufzufüllen)

Ich glaube ich bin flexibel, aber ich weiß nicht so richtig, ob ich so ein Programm in einem loop möglich ist? Weil ich will den Sensor permanent abfragen, und er soll nur 10 min pause machen wenn der Taster mal gedrückt wird. Und die LED soll blinken und der Taster soll Sensor und LED ausmachen und dann Sensor abfragen.

( Den Sensor kann ich nicht einfach mit den Werten die er hat an den Arduino anschließen, deswegen, hatte ich überlegt es vielleicht mit einem Komparator in ein eindeutiges Rechteck Signal zu verwandeln, aber leider weiß ich nicht, wie ich das zu berechne. Ein Arduino Nano Pin kann bis zu 40mA/6-12V max ertragen, hab ich das richtig nachgeschaut? Arduino Nano Pin Diagram, Features, Pin Uses & Programming (components101.com)
Sensor ist leider noch nicht eingetroffen, sonst hätte ich mal nachgemessen, was er wirklich ausgibt! )

Um vielleicht eine Basis zu liefern, hab ich mir den Button Sketch und einen Fotowiderstand geholt, um mal den Sensor zu simulieren. Ist zwar nicht das gleiche, aber vielleicht hilft es?
Ich versuchte gerade eine Art "ODER-Funktion" zu programmieren

const int LED =  13;
const int Taster = 12;
const int Sensor =  A0;


int Tasterabfrage = 0;
int Sensorabfrage = 0;

void setup() {
Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(Taster, INPUT);
}

void loop() {

Sensorabfrage = analogRead(Sensor);
Serial.print("Sensorwert = ");
Serial.print(Sensorabfrage);

if (Sensorabfrage > 70)
{
   Tasterabfrage = digitalRead(Taster);

  if (Taster == LOW) {
    digitalWrite(LED, HIGH);
    delay(2000);
    digitalWrite(LED,LOW);
  }
  
    else {
    digitalWrite(LED, LOW);
         }
}
 
            else
                 {
                     digitalWrite(LED, HIGH);
                     delay(2000);
                      digitalWrite(LED,LOW);
                 }
}

Schonmal vielen Dank für jede Antwort und bleibt gesund!

Hallo,
welchen Arduino verwendest du ?
Üblicherweise kann man den Pin 11 nicht als analogen Eingang verwenden.

Und die 40mA max. sind nicht als ERingangsstrom zu sehen, sondern als max. Ausgangsstrom z.B. für Leds.

Hallo Dieter!

erstmal vielen Dank für deine Antwort!
Ich verwende für das eigentliche Projekt einen Arduino Nano.

Allerdings mache ich gerade den Versuchsaufbau mit dem Fotowiderstand an einem Steckbrett mit einem Funduino Uno.

Also die 40mA im Datenblatt sind für was der Arduino ausgibt? Wonach müsste ich suchen, um den maximalen Eingangsstrom zu finden? :slight_smile:

Edit: ich hab den Eingangspin geändert vielen Dank!

jokarime:
Also die 40mA im Datenblatt sind für was der Arduino ausgibt? Wonach müsste ich suchen, um den maximalen Eingangsstrom zu finden? :slight_smile:

Ja, der Strom gilt als Ausgangsstrom.

Da ein Eingang sehr hochohmig ist, kannst du den Eingangsstom vernachlässigen.
Da geht es nur nach Spannung. An einem 5Volt Controller (wie im Nano) darfst du max. 5,5 Volt am Eingang haben. Darüber wird der Eingang das kaum überleben. Also bei höherer Spannung am analogen Eingang immer mit Spannungsteiler arbeiten.

(deleted)

Okay, danke!

dann denke ich wird der Komparator vielleicht doch nicht nötig sein, dann kann ich mir den "Aufwand" sparen :smiley:
Spannungsteiler ich glaub der Sensor gibt Maximal 10 Volt aus, also sollte ein Spannugsteiler der die Spannung 50/50 aufteilt nicht den Arduino überlasten?

Und ich hab im Programm versucht zwei if-Funktionen ineinander zuschalten, kann das so funktionieren?

Danke nochmal!!

Der Sensor braucht einen Lastwiderstand, der den Strom in eine Spannung umwandelt, die der Arduino ADC messen kann. Bei einem 5V Arduino wären das dann 240 Ohm gegen Gnd für knappe 5V Vollausschlag.

Von der Logik her sind es (mindestens) 3 Zustände: Messen, Alarm und Pause. Je nach Zustand (der Zustandsvariablen) wird dann gemessen, geblinkt oder gewartet. Vom Messen wird bei Überschreitung des Messwerts Alarm ausgelöst, der beim Drücken der Taste in Pause übergeht, die nach 10 Minuten beendet wird.

jokarime:
Okay, danke!

dann denke ich wird der Komparator vielleicht doch nicht nötig sein, dann kann ich mir den "Aufwand" sparen :smiley:
Spannungsteiler ich glaub der Sensor gibt Maximal 10 Volt aus, also sollte ein Spannugsteiler der die Spannung 50/50 aufteilt nicht den Arduino überlasten?

Und ich hab im Programm versucht zwei if-Funktionen ineinander zuschalten, kann das so funktionieren?

Danke nochmal!!

Ja, stimmt. Einen externen Komparator kannst du dir sparen, da der integriert ist.
Auch 2 if-Abfragen kannst du ineinander bauen, grundsätzlich funktioniert das.

Peter-CAD-HST:
Um aus Deinem Sketch die delay-Funktion herrauszunehmen, die delay-Funktion blockiert den Programmablauf, schaue dir im IDE das Beispiel BLINK WITHOUT DELAY an. Diesen Sketch kannst als Grundlage zum regelmäßigen auslesen des Sensors verwenden.
Viel Erfolg
Gruss Peter
take care

Vielen Dank Peter und ebenfalls ein Hallo!
Ich hab mit blink without delay die Schwierigkeit, das ich nicht ganz verstehe wie der Sketch funktioniert :confused:
Weil er hat einen Zähler der runterzählt, das Programm läuft aber weiter, richtig?
und sobald der Zähler abgelaufen ist geht das Programm so weiter was eben nach dem "Timer" steht?
Das ist was ich gerade mit den ineinander geschriebenen If-Funktionen erreichen wollte, um den Sensor abzufragen und falls er einen bestimmen wert hat soll die LED leuchten aber weiter soll wenn der Taster gedrückt ist, der Sensor 10 min lang nicht abgefragt werden und die LED auch nicht, und dann soll es wieder von vorne los gehen.

DrDiettrich:
Der Sensor braucht einen Lastwiderstand, der den Strom in eine Spannung umwandelt, die der Arduino ADC messen kann. Bei einem 5V Arduino wären das dann 240 Ohm gegen Gnd für knappe 5V Vollausschlag.

Vielen Dank!
Ich werde den Post nochmal updaten sobald der Sensor ankommt, die Post sagt 16.12.
Aber jetzt kann ich etwas mehr mit dem Programm arbeiten!

Danke auch an die anderen Antworten!!

Alles klar und viel Erfolg.

(deleted)

Peter-CAD-HST:
Moin jokarime
Da hilft nur zwischen den Ohren den Arduino-Simulator einzuschalten und den Sketch, mit einem Stück Papier und Stift für den aktuellen Inhalt der Variablen, durchzuspielen. Das hilft!

Und hier kommt ein Tipp von mir, besser gesagt mein Kochrezept:

Divide et impera (lateinisch für Teile und herrsche)
Aufteilung deiner Aufgabenstellung in Funktionen, nach dem EVA Prinzip, und deren Abhängigkeiten.
E=Eingabe --> Sensor
V=Verarbeitung --> Timer - Bewertung der Sensorergebnisse
A=Ausgabe --> Relais und was noch informiert werden muss
Alle Funktionen lassen sich einzeln testen, bevor diese in einer Kontrollstruktur, z.B. mit IF/SWITCH-CASE etc., zusammengelötet werden.
Viel Erfolg
Gruß Peter
und gesund bleib

Vielen Dank Peter!
ich fange mal damit an und auch mit den anderen Vorschlägen! Update sollte es wie gesagt hoffentlich am 16. oder 17.12 geben falls alles funktioniert xD
Bleib gesund!

So wie DrDietrich schon schrieb, benötigst du vermutlich für deinen Stromschleifensensor einen Widerstand.

Ich habe das mal für einen Drucksensor beschrieben:
https://werner.rothschopf.net/202009_arduino_stromschleifenschnittstelle_4mA_20mA.htm

auch wäre wichtig zu wissen, mit welcher Spannung dein Sensor arbeitet. Möglicherweise braucht der mehr als 5V um sicher zu funktionieren. Am besten du verlinkst mal ein Datenblatt deines Sensors.

noiasca:
Ich habe das mal für einen Drucksensor beschrieben:
Arduino: 4 - 20mA Stromschleifenschnittstelle für Industriesensoren

Vielen Dank!! Der Artikel ist toll, das hilft mir auf jedenfall!

noiasca:
auch wäre wichtig zu wissen, mit welcher Spannung dein Sensor arbeitet. Möglicherweise braucht der mehr als 5V um sicher zu funktionieren. Am besten du verlinkst mal ein Datenblatt deines Sensors.

KAS-80-30-IL20/UL10-M32-PTFE/MS-Z02-1-HP - Rechner Sensors (rechner-sensors.com)
Das ist der Sensor, den mir meine Arbeit für das Projekt zur Verfügung gestellt hat. Es geht bestimmt auch Simpler, aber ich hoffe damit ist etwas anzufangen :slight_smile:

Edit: Dieser Code ist stark Fehlerhaft!

const int LED =  13;
const int Taster = 12;
const int Sensor =  A0;
const long Interval = 1000;

int Tasterabfrage = 0;
int Sensorabfrage = 0;
int LEDabfrage = LOW;

int Modus;
int Schalter;

unsigned long previousMillis= 0;

void setup()
{
  Serial.begin(9600);         //Serieller Moniotor Zeit den Wert des Sensors an
  pinMode(LED, OUTPUT);
  pinMode(Taster, INPUT);
}

void loop()
{
 unsigned long currentMillis = millis();
 if(digitalRead(Sensor)) Modus = 1;
 if(digitalRead(Taster)) Modus = 2;

while(Modus == 1)   
                   
{
  Tasterabfrage = digitalRead(Taster);
  Sensorabfrage = analogRead(Sensor);
    Serial.print("Sensorwert = ");
    Serial.print(Sensorabfrage);
  
  if ((Sensorabfrage < 300) && (Tasterabfrage == LOW ) && (previousMillis == 0))
     {
      digitalWrite(LED, LOW);
      }
      else
            {
              digitalWrite(Modus, 2); // ###########
             }
      }
      
while(Modus == 2)                   
                                        

  Tasterabfrage = digitalRead(Taster);
  Sensorabfrage = analogRead(Sensor);
    Serial.print("Sensorwert = ");
    Serial.print(Sensorabfrage);

  if ((Tasterabfrage == HIGH) && (Sensorabfrage > 300))
  {
     if (currentMillis - previousMillis >= Interval) 
     {
   
    previousMillis = currentMillis;

    if (LEDabfrage == LOW)
    {
      digitalWrite(LED, HIGH);
    } else {
      digitalWrite(LED, LOW);
    }
    digitalWrite(LED, LEDabfrage);
     }
    
  }
    else {
    digitalWrite(LED, LOW);
         }
            else
                 {
                     digitalWrite(LED, HIGH);
                     delay(10000);
                     digitalWrite(LED, LOW);
                 }

}

Das habe ich jetzt erstmal als Programm geschrieben, sieht noch etwas unordentlich aus, ist nicht auf den Sensor abgestimmt, etc

Können die IF-Funktionen so hintereinander Funktionieren? Arduino IDE sagt Nein, weil vor dem letzten else kein if ist? Aber das zweite else nach else funktioniert? :smiley:

nah, wenn die IDE schon mault ...

drück mal STRG-T damit siehst du das besser was wo wie geschachtelt ist.

IF-Funktionen

Es gibt keine if- Funktionen.

Es ist eine Bedingte Anweisung.
Und natürlich tuts ein else nicht, ohne das zugehörige if und seine Bedingung.

Zudem möchte ich dir davon abraten in loop() lang laufende Schleifen unter zu bringen.

Mein Tipp:
Modularisiere die Aufgaben.
Schreibe flache Entscheidungsstrukturen.

Alles andere führt nur zu Verwirrungen.

Von mir kann ich sagen, dass ich solche tiefen Schachtelungen nur begrenzt überblicke.
Eine Tiefe von 2 ist gerade noch ok.
Ab 3 muss ich mich ernsthaft konzentrieren.
Bei 5 bin ich raus.
Das ist was für Masochisten, welche nichts besseres zu tun haben, als sich selbst zu verwirren/quälen.

Hallo,

Versuche doch mal die beiden Aufgben 1. Messen und Anzeigen 2. Auswerten und Melden in zwei logische Funktionsblöcke ( Funktionen ) zu packen. Dann kannst Du Dich einzeln damit beschäftigen. Zudem lernst Du wie man Funktionen erstellt, Parameter übergibt und Rückgabewerte verarbeiten kann.

Heinz

Rentner:
Versuche doch mal die beiden Aufgaben 1. Messen und Anzeigen 2. Auswerten und Melden in zwei logische Funktionsblöcke ( Funktionen ) zu packen.

Hallo Heinz!
vielen Dank!
Ich hab leider nicht viel Erfahrung mit langen Sketches, und ich hab in diesem Post (Zwei loops (arduino.cc)) gelesen, das mehrere Loops (ich hoffe das ist mit logischen Funktionsblöcken gemeint ) nicht immer die erste Lösung ist, deswegen wollte ich es zuerst anders versuchen!
Wenn der Sketch neu geschrieben wurde, poste ich ihn nochmal!

Grüße und bleib Gesund!!