Hay und Zwar haben wir einen Arduino mit einen Sim 900 modul zusammen gebaut. Dieses soll nach drücken eines Tasters einen Anruf tätigen. Problem ist aber solange der Taster gedrückt wird Ruft es immer wieder für 10 sec. an. Leider komme ich hierbei nicht weiter. Ideal wäre es wenn es einmal anruft und man dan einen zweiten Taster einmal drückt um das gerät wieder "Scharf zu stellen" das es wieder anrufen darf. Danke schon mal für die Hilfe
// Example 55.1 #include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // configure software serial port
const int buttonPin = 3;
int buttonState = 0;
void setup() {
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
SIM900.begin(19200);
SIM900power();
delay(30000); // give time to log on to network.
callSomeone(); // call someone
SIM900power(); // power off GSM shield7
}
}
// software equivalent of pressing the GSM shield "power" button
void SIM900power() {
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(5000);
}
void callSomeone() {
SIM900.println("ATD + +49xxxxxxxxxxxxx;"); // dial DE (49) xxxxxxxxxxxxx
delay(100);
SIM900.println();
delay(10000); // wait for 10 seconds...
SIM900.println("ATH"); // hang up
}
Hast du an deinem Taster-Pin einen Pulldown-Widerstand ?
Ohne den sieht der Controller immer HIGH.
Und setze deinen Sketch in Code-Tags (Schaltfläche </>) oben links im Editorfenster, dann wird dieser auch fehlerfrei und für alle gut lesbar angezeigt.
der Taster wird betätigt wenn sich eine tür schließt und soll sich dann melden aber nur einmalig bis man die tür wieder öffnet und sobald sich diese dann erneut schliest soll das gerät sich wieder melden im moment meldet es sich dauerhaft solange die tür zu ist
if (zustand==offen && tuer==zu){
melde: Tür wurde geschlossen;
zustand=zu;
}
If (zustand==zu && tuer==offen){
melde: Tür wurde geöffnet;
zustand=offen;
}
Eigentlich genau so, wie Du Das auch machst - Du merkst Dir, daß die Tür bereits verschlossen ist und rufst deshalb nicht alle drei Minuten bei Deiner Mutter an, um Ihr davon zu berichten.
Ggf. musst Du die Taster entprellen, damit Du dadurch keine Mehrfach-Erkennung bekommst.
Ich werde Dir gerne helfen, daß Du Deinen Code angepasst bekommst.
Ein Forum hat aber nicht den Sinn, daß per PN fertige Codes überreicht werden - wenn mich Deine Anfrage auch ehrt, hier gibt Es eine ganze Menge Leute mit wesentlich mehr 'Skills' in Sachen Arduino.
Versuche meinen Pseudo-Code zu verstehen und packe Das in Deinen Sketch - wenn's nicht klappt, kannst Du damit gerne wieder hier vorbei kommen - so sehen wir, wie weit Du gekommen bist und Du verstehst, was Du Da geschrieben hast.
Die Nachwelt wird bei einem ähnlichem Problem dann auch Deinen Werdegang sehen und so das Problem aus der Welt schaffen können - so gibt es nur Gewinner.
MfG
PS: Das 'in Code-Tags setzen' kannst Du nachträglich tun - mit der Bitte, daß Du Deinen Anfangs-Post durch Code-Tags (Schaltfläche </> im Antwort-Fenster) ergänzt.
Schau dir folgendes Beispiel in der Arduino-Software an:
Datei / Beispiele / 2.Digital / StateChangeDetection
Da wird gezeigt, wie auf einen gedrückten Taster nur einmal reagiert wird und die nächste Reaktion erst erfolgt, nachdem der Taster losgelassen wurde und danach erneut gedrückt wurde.
Ich denke, das ist etwa das was du möchtest - falls ich die Beschreibung richtig verstanden habe.
// Example 55.1
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // configure software serial port
const int buttonPin = 3;
int buttonState = 0;
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 1; // current state of the button
int lastButtonState = 0; // previous state of the button
void setup() {
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
if (buttonState != lastButtonState) {
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
} else {
}
SIM900.begin(19200);
SIM900power();
delay(30000); // give time to log on to network.
callSomeone(); // call someone
SIM900power(); // power off GSM shield7
}
Serial.println("off");
}
// software equivalent of pressing the GSM shield "power" button
void SIM900power() {
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(5000);
}
void callSomeone() {
SIM900.println("ATD + +49xxxxxx;"); // dial DE (49) xxxxx
delay(100);
SIM900.println();
delay(10000); // wait for 10 seconds...
SIM900.println("ATH"); // hang up
}
Hannnnes:
Es müsste doch dan so inetwa aussehn oder ??
Naja, da das nicht fehlerfrei kompiliert ist die Antwort wohl eher "nein"
Es könnte eventuell in etwa so funktionieren (vorhandener Code bearbeitet):
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // configure software serial port
const int buttonPin = 3;
int buttonState = 0;
int lastButtonState = 0; // previous state of the button
void setup() {
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
if (buttonState != lastButtonState) {
SIM900power();
SIM900.begin(19200);
delay(30000); // give time to log on to network.
callSomeone(); // call someone
SIM900.end();
SIM900power(); // power off GSM shield7
}
}
lastButtonState = buttonState;
}
// software equivalent of pressing the GSM shield "power" button
void SIM900power() {
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(5000);
}
void callSomeone() {
SIM900.println("ATD + +49xxxxxx;"); // dial DE (49) xxxxx
delay(100);
SIM900.println();
delay(10000); // wait for 10 seconds...
SIM900.println("ATH"); // hang up
}
Allerdings sind da sehr viele und vor allem sehr lange delays eingebaut (bis zu 30 Sekunden). Das führt dazu, dass auf einen "Tastendruck" nur sehr sehr zeitverzögert, bis gar nicht reagiert wird, weil während eines langen delays keine "Auswertung" des Button-Pins erfolgt.
Wahrscheinlich musst du dir statt dieser langen delays etwas Anderes überlegen.
(Auch dazu gibt es ein Beispiel: Datei / Beispiele / 2.Digital / BlinkWithoutDelay)
Aber du solltest du dir generell überlegen, was passieren soll, wenn während der Zeit die für den Netzwerkaufbau reserviert ist (30 Sekunden), der Button (die Tür) wieder geöffnet/geschlossen wird.
Naja - ich habe hier Türen, Die auch schon Mal öfter die Minute benutzt werden.
Da Du uns aber mit Deinem Aufbau nicht behelligen willst, wirst Du Da selber durch müssen.
Wir wissen von Deinem Projekt nur, was Du uns hier zeigst - und Das ist bisher recht übersichtlich.
Naja - ich habe hier Türen, Die auch schon Mal öfter die Minute benutzt werden.
Da Du uns aber mit Deinem Aufbau nicht behelligen willst, wirst Du Da selber durch müssen.
Wir wissen von Deinem Projekt nur, was Du uns hier zeigst - und Das ist bisher recht übersichtlich.
MfG
Naja was giebt es da zu behelligen es geht eigentlich um ein Großes Tor von welchem ich einfach wissen möchte wann es geöfnet wird und diese wird nicht sehr häufig betätigt.
uxomm:
Naja, wenn der Arduino sonst nichts zu tun hat (also auch auf nichts reagieren muss), dann könnte es funktionieren wie oben gezeigt.
Ja der Arduino hat sonst eigentlich nichts zu tun auser zumelden wenn das tor mal auf ging.
Cool wäre noch wenn man per SMS die nummer ändern könnte welche er anruft aber dazu hab ich noch keinerlei befehle gefunden
Hannnnes:
Naja was giebt es da zu behelligen es geht eigentlich um ein Großes Tor von welchem ich einfach wissen möchte wann es geöfnet wird und diese wird nicht sehr häufig betätigt.
Ja der Arduino hat sonst eigentlich nichts zu tun auser zumelden wenn das tor mal auf ging.
Wer kontrolliert denn, dass das Tor nicht so häufig geöffnet bzw. geschlossen wird.
Damit dir der Sketch nicht zukünftig auf die Füsse fällt, solltest du zwingend die delays ersetzen.