Go Down

Topic: Hall Sensor --> Anruf (Read 282 times) previous topic - next topic

jonas10

Sobald ein Hall sensor einen Magneten erkennt soll eine Nummer angerufen werden mittels GSM Modul.

Moko

Na dann leg los ;)
Eine Frage hattest Du ja nicht.

jonas10

#2
Oct 11, 2018, 02:57 pm Last Edit: Oct 11, 2018, 03:11 pm by jonas10
Das Programm funktioniert einwand jedoch sobald ich etwas in die Funktion void detect () schreibe wird der Magnet nich immer erkannt bzw er ruft nur teilweise an, an was könnte das liegen ?



Code: [Select]


#define Eingang 2                             // Drehzahl-Eingang: Pin2 / Interrupt 0
#include<SoftwareSerial.h>
SoftwareSerial gsm(10,11);


void setup() {
 pinMode(Eingang, INPUT);                    // Eingangspin auf Eingang stellen
 //digitalWrite(Eingang, HIGH);              // und Pullup-Widerstand einschalten
   
 Serial.begin(9600);

 // Interrupt 0 auf Routine readmicros setzen
 attachInterrupt(0, detectMagnet, FALLING);

 Serial.println("Hall-Effekt-Sensor Test");
}


void loop() {

}


// Interrupt-Routine
// Diese Funktion wird immer dann aufgerufen, wenn ein Magnet vom Arduino erkannt wird
void detectMagnet() {
 Serial.println("Magnet erkannt");
 delay(10000);
 Serial.begin(9600);
 gsm.begin(9600);
 gsm.println("ATDXXXXXXXXXX;");
 
}



HotSystems

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *). Das kannst Du auch noch nachträglich tun.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Tommy56

Du solltest Dich näher mit Interrupt-Routinen beschäftigern.
Sie müssen so kurz wie möglich sein, ein delay hat darin nichts zu suchen.
Für Deine Anwendung brauchst Du keinen Interrupt, das kannst Du im loop abfragen, wenn Du ohne Blockierung, also ohne delay programmierst.

Schau Dir BlinkWithoutDelay aus den Beispielen der IDE an und verstehe es.

Meinst Du, es bringt Dir viele Sympathien ein, wenn Du Dein Thema auf viele Einzelthreads aufteilst? Es könnte sein, dass Du dann sehr wenige Antworten bekommst.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Das Programm funktioniert Einwand....
Und das kann schon mal nicht stimmen.

Warum der Magnet nicht erkannt wird, können wir nicht wissen.
Evtl. ist dieser zu weit vom Hallsensor entfernt.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jonas10

Das Programm funktioniert Einwandfrei der Magnet wird erkannt aber sobald zusätzlich irgendwas in die Funktion "void detect ()" geschrieben wird, wird der Magnet nur teilweise erkannt

HotSystems

Das Programm funktioniert Einwandfrei der Magnet wird erkannt aber sobald zusätzlich irgendwas in die Funktion "void detect ()" geschrieben wird, wird der Magnet nur teilweise erkannt
"void detect()" sehe ich nicht.

Du meinst sicher "void detectMagnet()".

Dein Problem hat die Tommy schon geschildert.
Warum liest du nicht richtig.
Je länger deine IRQ-Routine wird, umso schlimmer.

Wozu überhaupt einen IRQ ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Tommy56

Die gebetsmühlenartige Wiederholung Deiner Behauptung wird nicht zum Ziel führen.
Die Ursache für das Fehlverhalten habe ich Dir genannt.

Nochmal: In einer Interruptroutine werden nur Flags gesetzt, die dann im Loop ausgewertet werden.

delay, Serial.print, gsm und ähnliche langsame Sachen haben darin nichts zu suchen.

Es bringt Dir nichts, unangenehme Antworten zu ignorieren.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

jonas10

Ok Danke werde probieren das Problem zu lösen

HotSystems

Ok Danke werde probieren das Problem zu lösen
Und lass dabei den IRQ aus dem Spiel.
Das geht auch alles ohne den.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jonas10

Habe mir das jetzt in etwa so vorgestellt, jedoch bis noch keinen erfolg gehabt habe mir auch BlinkWithoutDelay angesehen




Code: [Select]


const int hallSensorPin = 12; // Pin an dem der Hall-Sensor angeschlossen ist

int hallSensorStatus = 0;

void setup() {
  // Pin fuerr den Hall-Sensor als Eingang definieren
  pinMode(hallSensorPin, INPUT);
}

void loop() {
  // Status des Hall-Sensors auslesen
  hallSensorStatus = digitalRead(hallSensorPin);

  if (hallSensorStatus == LOW) {     

    Serial.println("EIN");
  } else {
    // LED ausschalten
    Serial.println("AUS");
  }

}


Rentner

Hallo , der Anfang ist ja schon Mal richtig , und wird der Sensor erkannt . ??

Also sorry du musst schon ein bisschen was sagen , wir können sonst besser mit der Glaskugel kommunizieren. Wenn die dann endlich Mal wieder läuft , die ist nämlich seit ein paar Wochen kaputt.

Heinz



gregorss

Habe mir das jetzt in etwa so vorgestellt ...
Liefert ein Hall-Sensor nicht ein analoges Signal? Wäre da ein Analog-Pin nicht besser geeignet?

Ich kenne diese Dinger blöderweise nicht. Im Datenblatt des Sensors solltest Du alle Informationen finden können.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen („Großes Lötauge", Medizinmann der M3-Hopi)
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

jonas10

Habe das Problem mittlerweile gelöst aber trotzem Danke

Go Up