sim800l e hc05 per ricevere comandi AT da smartphone

Ciao a tutti, come da oggetto sto cercando di costruire un circuito elettronico che tramite arduino, modulo sim800l e smartphones android possa permettere di inviare tramite seriale del bluetooth all'arduino dei comandi at, in particolare invio il comando: ATD+39..... per effettuare una chiamata telefonica che subito dopo qualche secondo si interrompre, se uso il comando AT da arduino il tutto funziona perfettamente mentre se invio il comando da smartphone ad arduino tramite seriale bluetooth vedo che nel monitor arriva perfettamente tutto il comando AT compreso del numero ma non parte la chiamata, qualcuno sa perchè?

posto il codice di arduino:

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(2, 3); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
 
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
  delay(1000);

  mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK
  updateSerial();
 
 //mySerial.println("ATD+393382275504;"); //  change ZZ with country code and xxxxxxxxxxx with phone number to dial
  updateSerial();
  delay(20000); // wait for xx seconds...
  mySerial.println("ATH"); //hang up
  updateSerial();
}

void loop()
{
  //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
  if(mySerial.available()){
    Serial.write(mySerial.read());
  }
  //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
  if(Serial.available()){    
    mySerial.write(Serial.read());
  
  }
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
   mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
 }
 while(mySerial.available()) 
 {
   Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
 }
}

Domanda banale: ma tu da Bluetooth mandi anche il fine linea dopo il comando (ossia '\r' e/o '\n')?

Ciao, non ho capito bene la domanda....il fine linea dal monitor di arduino?

I comandi AT per essere interpretati ed eseguiti DEVONO terminare con CR (0x0D), quindi ... tu invi il carattere terminatore via bluetooth? Altrimenti il comando AT NON verrà mai eseguito.

Guglielmo

P.S.: Le risposte, normalmente, vengono invece terminate dali moduli con la sequenza CR+LF (0x0D 0x0A)

Quando tu dal monitor di Arduino digiti qualcosa e premi invio, lui manda sulla seriale tutti i caratteri che hai digitato, piùi due caratteri standard di fine linea ossia '\r' (CR, Carriage Return ossia byte con codice 13) e '\n' (LF o NL, New Line, ossia codice 10).

Se tu da Bluetooth non mandi questi caratteri dopo la stringa AT (o almeno '\n'), non viene eseguita.

gpb01:
I comandi AT per essere interpretati ed eseguiti DEVONO terminare con CR

Mi hai anticipato mentre scrivevo, comunque il terminatore standard per quanto ne so è LF ossia '\n' non '\r' (CR)... :wink:

docdoc:
Mi hai anticipato mentre scrivevo, comunque il terminatore standard per quanto ne so è LF ossia '\n' non '\r' (CR)... :wink:

... sai male ... basta che vai a guardare i manuali SimCom ... :smiling_imp:

1.4 AT Command syntax
The "AT" or "at" or “aT” or “At”prefix must be set at the beginning of each Command line. To terminate a Command line enter .
Commands are usually followed by a response that includes. ""

Guglielmo

gpb01:
... sai male ... basta che vai a guardare i manuali SimCom ... :smiling_imp:

Ah, ok, buono a sapersi. Comunque sia, il "terminatore standard" è generalmente '\n' o 0x0A, se sui SIM usano 0x0D non lo capisco.. :wink:

Quindi il consiglio per l'OP dventa:

Se tu da Bluetooth non mandi 'r' dopo la stringa AT, non viene eseguita.
:smiley:

docdoc:
Ah, ok, buono a sapersi. Comunque sia, il "terminatore standard" è generalmente '\n' o 0x0A, se sui SIM usano 0x0D non lo capisco.. :wink:

Sai che io invece ho sempre visto il CR (0x0D)? Ali limite, in alcuni casi, la coppia CR+LF, ma LF da solo non l'ho mai incontrato ... magari su linux è così :wink:

Guglielmo

Eh, si, su Linux è proprio così infatti...

vi spiego perfettamente come sto lavorando, sto usando una app per android che sto sviluppando con b4x questa app si collega ad arduino tramite hc05 bluetooth nelle rispettive tx hg05 a rx arduino ed rx hc05 a tx arduino, poi uso il modulo sim800L EWB collegato ai pin 2 e 3 con la quale arduino invia la telefonata attraverso questo codice che funziona perfettamente ma solo dallo scketch: mySerial.println("ATD+xxxxxxx;");
quindi a questo punto dalla parte del software mettiamo che invio lo stesso codice in formato stringa ...cosa devo aggiungere affinchè viene riconosciuto da arduino ed effettuare la chiamata? perchè nel monitor vedo esattamente ciò che invia da schetck solo che non va, intanto riporto il codice arduino qui sotto:

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(2, 3); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{

  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);

  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK
  updateSerial();

 // mySerial.println("ATD+xxxxxxx;"); //  change ZZ with country code and xxxxxxxxxxx with phone number to dial
  updateSerial();
  delay(10000); // wait for xx seconds...
  mySerial.println("ATH\r\n"); //hang up
 
  updateSerial();
}

void loop()
{
  //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
  if (mySerial.available()) {
    Serial.write(mySerial.read());
   
  }
  //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
  if (Serial.available()) {
    mySerial.write(Serial.read());
    
  }
}

void updateSerial()
{
  delay(500);
  while (Serial.available())
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
   
  }
  while (mySerial.available())
  {
    
    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
  
  }
}

mentre questo è il codice dell'app che uso nello smartphone, cosa devo fare per funzionare?

#Region  Project Attributes 
	#ApplicationLabel: AutoCall by FiAnDaZa
	#VersionCode: 1
	#VersionName: 1.0
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: portrait
	#CanInstallToExternalStorage: True
	#BridgeLogger: True
#End Region

#Region  Activity Attributes 
	#FullScreen: False
	#IncludeTitle: True
#End Region

Sub Process_Globals
	'These global variables will be declared once when the application starts.
	'These variables can be accessed from all modules.
	Private xui As XUI
	Dim Serial1 As Serial
	Dim TextWriter1 As TextWriter
	Dim TextReader1 As TextReader
	Dim connected As Boolean
	Dim awake As PhoneWakeState
End Sub

Sub Globals
	'These global variables will be redeclared each time the activity is created.
	Private btninviadati As Button
	Private txtdati As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
	If FirstTime Then
		Serial1.Initialize("Serial1")
		' Timer1.Initialize("Timer1", 200)
	End If
	Activity.LoadLayout("Layout")
	
	Activity.AddMenuItem("Connetti", "mnuConnect")
	Activity.AddMenuItem("Disconnetti", "mnuDisconnect")
	Activity.AddMenuItem("Info Programma", "info")
End Sub

Sub Activity_Resume
	awake.KeepAlive(True)
	If Serial1.IsEnabled = False Then
		MsgboxAsync("Per favore abilita il bluetooth.", "IMPORTANTE!!!")
	Else
		Serial1.Listen 'listen for incoming connections
	End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
	awake.ReleaseKeepAlive
End Sub
Sub Activity_KeyPress (KeyCode As Int)  As Boolean
	Dim answ As Int
	If KeyCode = KeyCodes.KEYCODE_BACK Then
		answ = Msgbox2("Sei sicuro di voler uscire dal programma?","AVVISO!!","SI","","NO",Null)
		If answ = DialogResponse.POSITIVE Then
			mnuDisconnect_Click
			ExitApplication
			Return False
		Else
			Return True
	
		End If
	End If
End Sub
Sub mnuConnect_Click
	
   Dim PairedDevices As Map
   PairedDevices = Serial1.GetPairedDevices
   Dim l As List
   l.Initialize
   For i = 0 To PairedDevices.Size - 1
      l.Add(PairedDevices.GetKeyAt(i))
   Next
   Dim res As Int
   res = InputList(l, "Scegli Dispositivo", -1) 'show list with paired devices
   If res <> DialogResponse.CANCEL Then
      Serial1.Connect(PairedDevices.Get(l.Get(res))) 'convert the name to mac address
      'Serial1.Connect3(PairedDevices.Get(l.Get(res)),1)
   End If
End Sub

Sub Serial1_Connected (Success As Boolean)
	If Success Then
		
		ToastMessageShow("Connessione avvenuta", False)
		'TextReader1.Initialize(Serial1.InputStream)
		TextWriter1.Initialize(Serial1.OutputStream)
		' Timer1.Enabled = True
		connected = True
	Else
			connected = False
		'  Timer1.Enabled = False
		MsgboxAsync(LastException.Message, "Errore di connessione.")
	End If
End Sub

Sub mnuDisconnect_Click
	Serial1.Disconnect
	connected = False
End Sub

Sub btninviadati_Click
	If connected Then
		TextWriter1.Write("ATD+xxxxxxx;")' per x si intende +39 ed il numero, manca qualcos'altro?
		TextWriter1.Flush
	End If
End Sub

spero in un aiuto da parte vostra.

Sai quale è la differenza tra una Serial.print() ed una Serial.println() (quella che usi tu)? Che la Serial.println() oltre a quello che gli dici di trasmettere trasmette anche CR+LF ... basta andarlo a leggere sul reference ...

Prints data to the serial port as human-readable ASCII text followed by a carriage return character (ASCII 13, or '\r') and a newline character (ASCII 10, or '\n').

Se tu dalla tua App via Bluettoth NON mandi il CR ... il comando AT NON verrà mai eseguito.

Guglielmo

Perdonami guglielmo, dove inserisco il comando CR ? questo e il codice di partenza da parte del software android:
TextWriter1.Write("ATD+xxxxxxx;")' per x si intende +39 ed il numero, manca qualcos'altro?
TextWriter1.Flush

Non so su Android, in 'C' doversti mettere tra gli apici "ATD+xxxxxxxx\r" dove il \r viene interpretato come CR (valore esadecimale 0x0D). Se non va così devi trovare il modo di appendere a quella stringa il valore esadecimale 0x0D (decimale 13).

Guglielmo

Niente non riesco a venirne a capo, purtroppo la mia poca esperienza su arduino non mi fa risolvere la cosa, spero che lasciando il codice che ho inserito pèrima qualcuno riesca ad aiutarmi.

fifiddu:
mentre questo è il codice dell'app che uso nello smartphone, cosa devo fare per funzionare?

Te l'avevo già scritto, devi aggiungere un carattere CR (correzione di Guglielmo, per me era LF ;)) dopo il comando AT. Non conoscevo B2A/B2X ma essendo un smil-Basic credo basti fare:

...
	If connected Then
		TextWriter1.Write("ATD+xxxxxxx;" & CR)
		TextWriter1.Flush
	End If
End Sub

(io per sicurezza userei comunque entrambi i caratteri terminatori, quindi CRLF al posto del solo CR).
Fammi sapere.

EDIT: ho letto che le costanti CR e CRLF su B4A mandano entrambe solo il carattere 10 ossia LF. Se è vero, e se SIM richiede invece (almeno) il CR, io al tuo posto metterei entrambi con la funzione chr() che è del Visual Basic ma che dovrebbe essere uguale anche per B4A, ossia:

		TextWriter1.Write("ATD+xxxxxxx;" & Chr(13) & Chr(10))

Prova e fammi sapere.

... le specifiche parlano SOLO di CR, inviare i due potrebbe significare lasciare nel buffer un carattere NON riconosciuto (LF) che, anteposto al successivo comando AT magari lo rende non valido.

Per non rischiare, se sul datasheet c'è scritto di inviare solo CR ... bisogna inviare solo CR.

1.4 AT Command syntax
The "AT" or "at" or “aT” or “At”prefix must be set at the beginning of each Command line. To terminate a Command line enter .

Commands are usually followed by a response that includes. ""

Guglielmo

Si, l'ho capito, lo hai già scritto, ed io l'ho anche scritto, ma ho indicato entrambi per completezza e "parallelo" con il Basic. Ma in ogni caso credo che, per compatibilità col resto del mondo (solo LF per Linux, MacOS, BeOS, ecc., e CR+LF per Windows) il carattere LF venga ignorato dal SIM800.

Non ho un modulo su cui provare, altrimenti avrei dato una risposta più certa, in ogni caso sono si e no 30 secondi di prove, e l'OP trova quello che funziona per lui (e se, per curiosità, vuoi provare anche tu il discorso del carattere LF).

Ok DocDoc con questo tuo consiglio adesso funziona, fa la chiamata ogni volta che premo il pulsante con la stringa: TextWriter1.Write("ATD+393382275504;" & Chr(13) & Chr(10))
adesso non riesco a far chiudere in automatico la chiamata dopo ad esempio 8 secondi,
da schetch funzionava. ho provato ad inviare la stringa di chiusura chiamata da smartphone: TextWriter1.Write("ATH\r\n")
TextWriter1.Flush
ma non viene letta dall'hc05 sembra che sia bloccato durante la chiamata.

Provi a togliere quel CHR(10) e quel \n che il datasheet dice che non devono esserci e prova con il solo CR ... ::slight_smile:

Inoltre, quali pin usi per leggere il SIM e quali per leggere il HC05? Usi la SoftwareSerial? Se SI, per cosa?

Guglielmo

Guglielmo ho provato come hai detto tu, non funziona invece ho provato questo codice e funziona perfettamente: TextWriter1.Write("ATH"& Chr(13))