bin dabei ein Sim900 GSM Modul für eine KFZ Standheizung in Betrieb zu nehmen.
Da ich relativ neu in der Materie bin stellen sich so manche fragen.
Soweit bin ich jetzt.
Wenn ich jetzt auf Sketch hochladen gehe führt er das Setup aus und initialisiert das Sim900 Modul.
Also alles gut.
jetzt hab ich die Serielle schnittstelle vom PC abgezogen und den Arduino und Sim900 mit einem gemeinsamen Netzteil (5V) versorgt.
Wenn ich das Netzteil jetzt aus und einschalte Initialisiert er das Sim900 Modul nicht richtig.
d.h. wenn ich das Sim Modul anrufe geht der Anruf gar nicht erst durch.
Drücke ich jetzt den Taster (switchs) um die Initialisierung manuel zu machen geht der Anruf danach durch.
Warum Initialisiert er nicht in der Setup schleife wenn der USB stecker nicht am PC steckt.
Es ist so als ob er serielle Daten dann nicht los wird und blockiert.
habe jetzt ein FTDI an pin 1 und 2 am Arduino uno angeschlossen und sehe da jetzt am pc bei einem Strom Reset kommt die initialisierung nicht.
Das hatte ich erst gemacht hat aber dann gemeckert da mehr als 9000 zeichen ?
Ein Problem wie "setup wird nicht richtig ausgeführt" wird am besten erforscht, geklärt und womöglich gelöst, wenn man alles entfernt, was nichts mit dem vermuteten Problem zu tun hat. Entweder das Problem ist dann verschwunden oder stellt sich anders dar, und man hat so wichtige Hinweise zur Klärung gewonnen, oder man sieht selbst klarer, was das zugrundeliegende Problem ist, oder man hat zumindest etwas, das man mit besserem Gewissen anderen willigen Helfern zumuten kann.
Ich halte die Grenze von 9000 Zeichen für sehr sinnvoll.
ich vermute ein Zeitproblem beim hochlaufen der beiden Teile. Eventuell ist der Arduino schneller als das GSM hochgelaufen. Versuche mal ein delay(2000) vor dem initialisieren des GSM Moduls.
Hallo,
das SIM800 zieht richtig Strom. Du brauchst für das SIM900 5v/2A. Gemeinsame Masse nicht vergessen.
Dafür brauchst Du sicher 10000ms. Es dauert so 7 bis 8 Sekunden, bis sich das SIM900 sicher
mit einem Provider/Netz verbunden hat. Provider und Netz kannst Du am SIM900 abfragen.
Wenn Du keine Einstellungen im SIM900 gespeichert hast, dann fängt es bei jedem Spannungsverlust bei
Anfang an.
Es ist dann auf AutoBaud eingestellt. Kann man machen, ist aber zweifelhaft.
Wenn jetzt das SIM900 hochgefahren ist, dann stellt Du es z.B. auf 19200 Bd ein.
Nach einem (JEDEM)AT-Kommando ein delay(120) ist zu wenig. Ab 750 sollte es sicher funktionieren.
In "void InitSim900()" wartest Du jedesmal auf die Serielle, das brauchst Du nicht. Blödsinn.
Einfach so:
Hallo,
sorry hab eben erst mitbekommen das hier schon einiges gepostet wurde.
Ja stimmt es ist ein A6 Board wobei ich es jetzt gegen ein Sim900 Board ausgetauscht habe.
/*
Name: StandheizungGSM.ino
Created: 06.11.2019 06:33:29
Author: jost Mario
https://www.geeetech.com/wiki/index.php/Arduino_GPRS_Shield
*/
#include <TinyGPS++.h>
TinyGPSPlus gps;
#define Sim900_Serial Serial2
#define GpsNeo6_Serial Serial3
static const uint32_t SerialBaud = 115200; // Baudrate für PC Serial Baud
static const uint32_t SerialBaudGSM = 19200; // Baudrate Sim900 Modul
static const uint32_t SerialBaudGPS = 9600;
bool simm900_isINIT = false;
bool Neo6mGPS_isInit = false;
bool started = false;
// Pinbelegungen
const int Relay = 10; // Pin für Relays Standheizung an
const int switchs = 7; // Pin für Stanheizung Starttaster
const int esppin = 6; // Heizung Start
const int EspPinRueck = 5; // Rückmeldung an ESP
const int HeizungLed = 8; // Led Standheizung Aktiv
const int sim900PowerPin = 7; // Pin zum Einschalten des Sim900 Moduls
void InitSim900();
void sim900_PowerOn();
// the setup function runs once when you press reset or power the boardd
void setup()
{
sim900_PowerOn(); // Erst im Endprodukt Funktionsfähig
Serial.begin(SerialBaud);
Sim900_Serial.begin(SerialBaudGSM);
GpsNeo6_Serial.begin(SerialBaudGSM);
// AT an SIm900 Modul um Autobaudrate einzustellen
Serial.println("+++ sende AT fuer Autobaud +++");
while (Sim900_Serial.read() >= 0); // Empfangsbuffer leeren
Sim900_Serial.println("AT");
delay(300);
Serial.println("wait for GSM init.......");
}
// the loop function runs over and over again until power down or reset
void loop()
{
// 10000 ms warten bis Modul eingebucht hat dann Initialisieren.
if ((millis() > 10000) && (simm900_isINIT == false))
{
Serial.println("loop");
Serial.println(millis());
InitSim900();
// InitGPSModul();
}
if (Sim900_Serial.available()) // Sendet Daten bei z.b. Anruf oder SMS
Serial.write(Sim900_Serial.read());
if (Serial.available())
Sim900_Serial.write(Serial.read());
// if (GpsNeo6_Serial.available()) // GPS Sensor sendet Daten im Secundentakt raus
// Serial.println(GpsNeo6_Serial.read());
//if (Serial.available())
// GpsNeo6_Serial.write(Serial.read());
}
void InitSim900()
{
simm900_isINIT = false;
Serial.println("+++ begin sim900 initialisierung +++");
delay(20);
Sim900_Serial.println("AT");
delay(700);
Serial.println("+++ Signal Qualitaet +++ abfragen");
Sim900_Serial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
delay(740);
Sim900_Serial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
delay(740);
Sim900_Serial.println("AT+CREG?"); //Check whether it has registered in the network
delay(740);
Sim900_Serial.println("AT+CLIP=1"); //rufnummer anzeige aktivieren CLIP
delay(740);
Sim900_Serial.println("AT+CNMI=2,2,0,0,0");
delay(740);
Serial.println("+++ set SMS mode to text +++");
Sim900_Serial.println("AT+CMGF=1"); // set SMS mode to text
delay(740);
Serial.println("+++ sms speicher leeren +++");
Sim900_Serial.println("AT+CMGD=1,4"); // delete all SMS
delay(740);
Serial.println("+++ sim900 initialisiert +++");
simm900_isINIT = true;
}
void sim900_PowerOn()
{
Serial.println("+++ Sim900 Power On..... +++");
// Einschaltprozedur für Sim900 Modul
pinMode(sim900PowerPin, OUTPUT);
digitalWrite(sim900PowerPin, LOW);
delay(1000);
digitalWrite(sim900PowerPin, HIGH);
delay(2000);
digitalWrite(sim900PowerPin, LOW);
delay(3000); // Wareten bis Modul Hochgefahren
}
Wenn ich es jetzt hochlade und mir dann die Serielle Konsole anschaue sieht diese so aus:
Uploading to I/O board
Opening port
Port open
+++ sende AT fuer Autobaud +++
wait for GSM init.......
AT
OK
loop
10001
+++ begin sim900 initialisierung +++
+++ Sende AT +++
+++ Signal Qualitaet +++ abfragen
+++ Sim Karte abfragen +++
+++ Check Network +++
+++ set CLIP +++
+++ set SMS mode to text +++
+++ sms speicher leeren +++
+++ sim900 initialisiert +++
AT
OK
AT+CSQ
+CSQ: 16,0
OK
AT+CCID
89492021186039
wieso verschluckt er manche Befehle bzw kommt keine Rückmeldung vom Sim900 Modul z.b.
Sim900_Serial.println("AT+CLIP=1"); //rufnummer anzeige aktivieren CLIP
wieso verschluckt er manche Befehle bzw kommt keine Rückmeldung vom Sim900 Modul
Alle AT Befehle in InitSim900() werden ausgeführt ohne die Antwort zu lesen, wenn ich deinen Sketch richtig verstehe. Das Protokollieren der letzten 64 Antwort-Zeichen erfolgt dann erst anschließend.
Wäre eventuell schöner, gleich die Antworten zu lesen (und protokollieren)
und statt delay() auf die Antwort "OK" gleich zu reagieren.