Induktiven Sensor einbinden

Hallo zusammen,

ich programmiere gerade zum ersten mal einen Arduino. Nun habe ich folgendes Problem und ich finde den Fehler nicht, weil ich nicht einschätzen kann, ob dieser an meinem Programm oder Hardware liegt.

Also der Grundgedanke ist, dass ich über einen induktiven Sensor einen Zählwert, welcher vorher über en Tastenfeld eingegeben werden kann runterzählen möchte. Sprich immer wenn der Sensor schaltet wert = -1. Auch soll der Wert mit einem Taster auf null gesetzt und mit zwei anderen Tastern von Hand rauf und runter gezählt werden können.

Einmal der Hardware technische Aufbau:
IC: Arduino Uno
Taster: sind über Seed Platinge angeschlossen
Displays : Über I2C auf die Seed Platine

Hier ist das Problem, das der Sensor eine Schaltspannung von 24V besitzt. Da man damit nicht direkt auf den Arduino gehen kann, habe ich einen Spannungswandler dazwischen geschaltet, welcher die Spannung auf 5V steuert. Auch gehe ich nicht direkt mit der Signallitze auf den Eingang des Spannungswandlers, sondern auf ein Relais, welches schaltet und dann 24V auf den Eingang des Spannungswandlers gibt.

Hier habe ich schon folgendes probiert:

  • Spannung am Eingang des Wandlers gemessen
  • Spannung am Ausgang des Wandlers gemessen
  • Alle Leitungen mit einem Multimeter durchgebimmelt

Das Programm läuft so weit rund, allerdings zählt der Zähler einfach die ganze Zeit ununterbrochen um eins runter. Ich habe für den Sensor ganz normal den Pin 12 als Eingang deklariert und dann einfach in eine IF- Abfrage eingebunden, mit einem einfachen Zähler. Ich hänge euch den Code einfach an.

Ich freue mich über jeden Tipp oder Ratschlag :slight_smile:

#include <rgb_lcd.h>                     // https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight
#include <Wire.h>                       // Libary für den I2C Bus
#include <LiquidCrystal_I2C.h>         // https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
#include <Keypad.h>                   // https://github.com/Chris--A/Keypad 

rgb_lcd lcd;                         // Initialisierung der LCD Displays

//Hier wird die größe des Keypads definiert
const byte COLS = 3; //3 Spalten
const byte ROWS = 4; //4 Zeilen
//Die Ziffern/Zeichen:
char hexaKeys[ROWS][COLS]={
{'#','0','*'},
{'9','8','7'},
{'6','5','4'},
{'3','2','1'}
};
byte colPins[COLS] = { 11, 10, 9 };   //Definition der Pins für die 3 Spalten
byte rowPins[ROWS] = { 8, 7, 6, 5 }; //Definition der Pins für die 4 Zeilen
char pressedkey; //pressedKey entspricht in Zukunft den gedrückten Tasten
Keypad mykeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann absofort mit myKeypad angesprochen werden


//Variablen sammlung 
const int colorR = 255;              // Initialisierung der konstanten Integer Variable zur Farbausgabe Rot                     
const int colorG = 0;               // Initialisierung der konstanten Integer Variable zur Farbausgabe Gruen 
const int colorB = 255;            // Initialisierung der konstanten Integer Variable zur Farbausgabe Blau 
const int buttonPin1 = 2;         // Initialisierung der konstanten Integer Variable für den Hoch Button
const int buttonPin2 = 3;        // Initialisierung der konstanten Integer Variable für den runter Button
const int buttonPin3 = 4;       // Intialisierung der konstanten Integer Variable für den Reset Button
const int sensorPin = 12;      // Intialisierung der konstanten Integer Variable für den Sensor
const int ledPin = 13;        // Initialisierung der konstanten Integer Variable für den LED Button
int buttonstate1 = 0;        // Initialisierung der Integer Variable für Status des Buttons
int buttonstate2 = 0;       // Initialisierung der Integer Variable für Status des Buttons
int buttonstate3 = 0;      // Initialisierung der Integer Variable für Status des Buttons
int sensorstate=0;        // Intialisierung der Integer Variable für Status des Sensors 
int x;
long zahl, zahla=0, zahlb=0, zahlc=0, zahld=0;  // Variablen zur Eingabe der Zahlen
bool a=0, b=0, c=0, d=0;




void setup() 
{
     
    lcd.setRGB (colorG, colorR, colorB);         // Festlegung der zu leuchtenden Hintergrundfarbe des Displays
     
     
  
    pinMode(buttonPin1, INPUT_PULLUP);        // Festlegung des Eingangs D2 als Eingang und ansprechen des internen Pullup Widerstand
    pinMode(buttonPin2, INPUT_PULLUP);       // Festlegung des Eingangs D3 als Eingang und ansprechen des internen Pullup Widerstand
    pinMode(buttonPin3, INPUT_PULLUP);      // Festlegung des Eingangs D4 als Eingang und ansprechen des internen Pullup Widerstand
    pinMode(ledPin, OUTPUT);               // Festlegung der internen LED als Ausgang
    pinMode(sensorPin,INPUT_PULLUP);             // Intialisierung des digitalen PIN als Input 
}
    
  
 
void loop(){

      Anfang:
      pressedkey = mykeypad.getKey();                 // Eingabe entspricht der gedrückten Taste
        if (pressedkey)
        {
          switch (pressedkey){
          case '*': //Gerade aktive Zahl löschen
              if(a)  zahla=0;
              if(b)  zahlb=0;
              if(c)  zahlc=0;
              if(d)  zahld=0;
              zahl=0;
              break;
          case'1' : zahl*=10; zahl+=1; break;       //Die Ziffern 1 bis 0 eingeben
          case'2' : zahl*=10; zahl+=2; break;
          case'3' : zahl*=10; zahl+=3; break;
          case'4' : zahl*=10; zahl+=4; break;
          case'5' : zahl*=10; zahl+=5; break;
          case'6' : zahl*=10; zahl+=6; break;
          case'7' : zahl*=10; zahl+=7; break;
          case'8' : zahl*=10; zahl+=8; break;
          case'9' : zahl*=10; zahl+=9; break;
          }
          }
       
      
      lcd.begin(16, 2);                          // Start des Displays mit Zeilen und Spalten
      lcd.print("Zaehlwert:" );                 // Textausgabe auf Display
      lcd.print(zahl);                          // Textausgabe der Variablen
     // lcd.print (zahlb);
      delay (150);                            // Delay zur entspannteren Eintragung des Wertes
      
     
    buttonstate1 = digitalRead(buttonPin1);        // Status auslesen des Pushbutton 1
    buttonstate2 = digitalRead(buttonPin2);       // Status auslesen des Pushbutton 2
    buttonstate3 = digitalRead(buttonPin3);      // Status auslesen des Pushbutton 3
    sensorstate = digitalRead(sensorPin);        // Status auslesen des Sensors


    //-------------------------------------------------------------------------------------------------------------------------------------------

   if (buttonstate1== HIGH){                  // Wenn der Button gedrückt ist....

        digitalWrite(ledPin, HIGH);           // Dann lasse LED leuchten
        x=zahl++;                            // Dann zaehle den Wert in der Variable wert um einen hoch und scchreibe sie in die Variable x 
        
   }                    
   else{                                   // Sonst...                    
     digitalWrite(ledPin, LOW);           // bleibt die LED aus 
   } //-------------------------------------------------------------------------------------------------------------------------------------------
   

    if (buttonstate2 == HIGH){              // Wenn der Button gedrückt ist....

        digitalWrite(ledPin, HIGH);       // Dann lasse LED leuchten
        x=zahl--;                        // Dann zaehle den Wert in der Variable wert um einen hoch und scchreibe sie in die Variable x 
   }
   else{                               // Sonst...
     digitalWrite(ledPin, LOW);       // bleibt die LED aus
   } //----------------------------------------------------------------------------------------------------------------------------------------------
  

     if (buttonstate3 == HIGH){             // Wenn der Button gedrückt ist....

        digitalWrite(ledPin, HIGH);        // Dann lasse LED leuchten
                               
          zahl =0;
          goto Anfang;
      
   }
   else{                               // Sonst...
     digitalWrite(ledPin, LOW);       // bleibt die LED aus
  } //---------------------------------------------------------------------------------------------------------------------------------------------

     if (sensorstate == HIGH){             // Wenn der Button gedrückt ist....
                              
          x=zahl--;
         
      
   }
   //else{                               // Sonst...
     //digitalWrite(ledPin, LOW);       // bleibt die LED aus
    
 //  }
}
   
    

das ist falsch... HIGH ist wenn der Button NICHT gedrückt ist

pinMode(buttonPin1, INPUT_PULLUP);  

Du gibst deinen Tastereingängen mit dem Befehl einen Plus über 10k

Dann fragst du auf HIGH ab, also auf Plus. Aber der Eingang ist immer auf plus was du mit IMPUT_PULLUP festlegst.

 if (buttonstate1== HIGH){  

Du mußt mit dem Taster GND auf den Pin schalten, und auf LOW abfragen. Dann bekommst du wirklich nur ++ beim Tastendruck.

Franz

Danke für den Tipp, allerdings geht es nicht um die Buttons, diese funktionieren einwandfrei und sind über so eine Platine an den Anduino angeschlossen.


Es geht mir um die Einbindung des Sensors, welcher selbst ohne Pullup Widerstand ein dauerhaftes eins Signal gibt und der Zähler daurhaft runterzählt.

Wenn Du ein Relais ansteuerst wieso nimmst Du nicht den Kontakt des Relais als "Eingabegerät"; einfach gleich wie einen Taster beschalten/anschließen.

Generell gesagt DC/DC Wandler sind Netzteile für die Stromversorgung und keine Geräte für Datenumformung. Ein Netzteil ist gemacht daß ein Strom gezogen wird. Die Spannung soll so konstant wie möglich sein und auch kurze Spannungslücken am Eingang sollen möglicht am Ausgang nicht ankommen ( wir reden hier von Zeiten von einigen mS).

Es gibt diese induktiven Sensoren mit verschiedenen Ausgangsschaltungen. Ein NPN Open Collektor Ausgang könnte ohne weitere Beschaltung (außer eines Pullupwiderstandes) an einen Eingeng angeschlossen werden obwohl der Sensor mit 24V versorgt wird. Gleiches gilt für einen Kontakt eines Relais oder Optokopplers (potentialfreier Ausgang Potentialfreier Kontakt – Wikipedia )

Welchen Sensor hast Du (Bitte genaue Typenbezeichnung)

Grüße Uwe

Ich habe diesen Sensor: https://www.di-soric.com/int-de/PM/Sensoren/Induktive-Sensoren/Induktive-Naeherungssensoren/INC-Advanced/DCC-08-M-04-PSK-TSL__202309

Also könnte ich mit einem Sensor welcher NPN verschaltet ist direkt auf den DI vom Arduino gehen und das ganze einfach wie nen Taster programmieren ?

Der Sensor den Du hast hat eine PNP Ausgang. Der ist schwierig zu verwenden weil wenn der Ausgangstransistor eingeschaltet wird, den Ausgang auf +Versorgungsspannung , also 24V zieht.
Wenn der Ausgangstransitor ausgeschaltet ist ist der Ausgang isoliert (gibt keine Spannung aus).
Da ist der Umweg über ein Relais oder einen Optokoppler notwendig. Du könntest auch mit dem Ausgang einen NPN Transistor ansteuern und mit diesem den Arduino-Eingang. Da ziehe ich aber einen Optokoppler vor.

Ein NPN Ausgang zieht bei Einschalten den Ausgang auf Masse. Ausgeschaltet wird keine Spannung ausgegeben. Dieser kann direkt mit Arduino benutzt werden:
Masse des Arduino und der 24V Versorgung verbinden; Ausgang auf Arduino Eingang schalten und internen Pullupwiderstand aktivieren oder externen Pullupwiderstand gegen 5V anschließen.

Ja. Einfach wie einen Schalter verschalten.

Grüße Uwe

In etwa!
Aber auch da ist ein bisschen Schutzschaltung kein Fehler, um Störungen fern zu halten und auch damit ein sterbender Sensor nicht den Arduino mit reißt.

Das gleiche gilt für PNP Sensoren.

In beiden Fällen:
Dort kann die Schutzschaltung auch sofort Spannungsteiler spielen.

-----

Deine Schaltung mit dem Relais, verstehe ich nicht.
Ein Bild? Schaltplan?
Aber wäre durchaus auch eine Methode, wenn es denn richtig eingestielt wird.

Ich zeichne Morgen mal einen Schaltplan wie ich das mit dem Relais verschaltet habe.

So hier einmal der Schaltplan.

Der Schaltausgang des Sensors ist an A1 angeschlossen und über ein Hilfskontakt wird bei Anzug des Relais die 24V auf den DC/DC Wandler gegeben.

Du kannst viel einfacher den Kontakt des Relais wie einen Taster am Arduino verwenden.

Grüße Uwe

Das würde dann auch den Arduino nicht töten, weil das 24V wären die da drauf gehen würden ?

????
Ja, mit 24 V machst Du den Arduino definitiv kaputt.
Aber ich verstehe nicht woher 24V kommen sollten wenn Du einen Kontakt des 24V-Relais an 5V anschließt.
Grüße Uwe

Ich beschreibe noch einmal den IST-Zustand.
Ich schalte das Relais mit dem 24V Schaltausgang des Sensors.
An einem Hilfskontakt des Relais liegen 24V an und bei Anzug des Relais werden diese auf einen Spannungswandler ( sowas hier nur mit Lötkontakten statt Klemmen https://www.amazon.de/Power-Modul-DC-DC-Netzteil-Konverter/dp/B071ZRXKJY/ref=asc_df_B071ZRXKJY/?tag=googshopde-21&linkCode=df0&hvadid=231877237116&hvpos=&hvnetw=g&hvrand=5217750527003806364&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9043979&hvtargid=pla-379884439360&psc=1&th=1&psc=1) geschaltet, welcher die 24V in 5V umwandelt und dann auf den DI vom Arduino geht.

Nimm doch einfach die 24V des Sensors und teile sie mit zwei Widerständen runter.

grafik

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.