Domanda:
Ricevere SMS da Arduino GSM Shield e controllare il LED con il contenuto di questo SMS?
Zhu
2014-06-10 15:01:40 UTC
view on stackexchange narkive permalink

Utilizzo Arduino GSM Shield per ricevere SMS da un'app Android. E il contenuto di questo SMS controllerà un LED. Se il contenuto di questo SMS non è "spento", il LED sarà acceso e il contenuto verrà stampato sul monitor seriale. Ma se è "spento", il LED si spegnerà immediatamente. Inoltre, il LED rimarrà acceso fino all'arrivo del messaggio "off". Per ora, ho utilizzato il codice dell'esempio del software. Ma non posso utilizzare il contenuto di questo SMS per controllare lo stato del LED. Con il codice sottostante, il LED non può essere acceso e il contenuto non può essere visualizzato sul monitor. Penso che sia stato perché lo schizzo non è riuscito a ottenere l'intero contenuto di questo SMS. Qualcuno potrebbe dirmi come risolvere questo problema? Grazie.

  #include <GSM.h>GSM gsmAccess; GSM_SMS sms; char senderNumber [20]; int led = 13; void setup () {Serial.begin (9600); pinMode (led, OUTPUT); digitalWrite (led, LOW); while (! Serial) {; } Serial.println ("Ricevitore di messaggi SMS"); boolean notConnected = true; while (notConnected) {if (gsmAccess.begin ("6442") == GSM_READY) notConnected = false; else {Serial.println ("Non connesso"); ritardo (1000); }} Serial.println ("GSM inizializzato"); Serial.println ("Waiting for messages");} void loop () {char c; int val = 0; val = digitalRead (led); if (val == HIGH) {digitalWrite (led, HIGH); } if (sms.available ()) {Serial.println ("Messaggio ricevuto da:"); sms.remoteNumber (senderNumber, 20); Serial.println (senderNumber); if (sms.peek () == '#') {Serial.println ("SMS scartati"); sms.flush (); } while (c = sms.read ()) if (c = 'off') {digitalWrite (led, LOW); } altro {digitalWrite (led, HIGH); Serial.print (c); } Serial.println ("\ nEND OF MESSAGE"); sms.flush (); Serial.println ("MESSAGGIO ELIMINATO"); } ritardo (1000);}  
Se la risposta seguente ti ha effettivamente aiutato a risolvere il tuo problema, contrassegnala come risolta / corretta. Inoltre, aiuterebbe gli altri se potessi modificare la tua domanda per riflettere le modifiche che hai apportato per farla funzionare.
prima voglio sapere dove hai aggiunto "smsData [smsIndex ++] = c; smsData [smsIndex] = '\ 0';" ?
@user2788 l'ho aggiunto di seguito mentre, e quindi uso strcmp (smsData, "off") == 0 per verificare se il contenuto di questo sms è "off".
Due risposte:
#1
+4
Dave Tweed
2014-06-10 16:12:57 UTC
view on stackexchange narkive permalink

Prima di tutto, hai un errore di battitura: hai bisogno dell'operatore doppio uguale in

  if (c == 'off') { 

Ma ancora più importante, non puoi usare una variabile char per contenere o confrontare più di un carattere alla volta. Non conosco i dettagli della libreria GSM di Arduino, ma se sms.read () restituisce una stringa, allora avrai bisogno di una variabile di stringa o di un array di char per mantenere il risultato.

Sono riuscito ad aggiungere "smsData [smsIndex ++] = c; smsData [smsIndex] = '\ 0';". Grazie per la tua risposta.
#2
+1
GMishx
2017-03-05 10:28:53 UTC
view on stackexchange narkive permalink

La funzione sms.read () restituisce solo un singolo byte della stringa SMS. Puoi memorizzare tutti i dati in un array di caratteri ed elaborarli in seguito come segue:

  char c, message [140]; int i = 0; while (c = sms.read ()) {messaggio [i ++] = c;} if (strstr (messaggio, "off")) {// Se l'SMS contiene off ovunque digitalWrite (led, LOW);} else {digitalWrite (led, HIGH); Serial.print (message);}  

E credo che la seguente parte del tuo codice non sia richiesta perché non sta facendo nulla:

  val = digitalRead (led); if (val == HIGH) {digitalWrite (led, HIGH);}  


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...