Receive SMS code probleempje

algemene C code
Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Receive SMS code probleempje

Berichtdoor christiaan » 03 Mei 2016, 11:26

Hallo allemaal,

Met een gsm shield heb ik gebruik gemaakt van de algemene code voor de receive sms functie. Nu wil ik dat hij een x aantal uitgangen aanstuurt om zo te laten zien of mensen de bom hebben ontmanteld. Dit gebeurt door een 6 cijferige code.

Nu is alleen de controle op de sms inhoud niet goed, want welke code ik ook verstuur, hij accepteert het. Wie kan mij op weg helpen met het laatste stukje?

cpp code
/*
SMS receiver

This sketch, for the Arduino GSM shield, waits for a SMS message
and displays it through the Serial port.

Circuit:
* GSM shield attached to and Arduino
* SIM card that can receive SMS messages

created 25 Feb 2012
by Javier Zorzano / TD

This example is in the public domain.

http://www.arduino.cc/en/Tutorial/GSMExamplesReceiveSMS

*/

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER "0000"

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20];

void setup() {
// initialize serial communications and wait for port to open:
Serial.begin(9600);
pinMode(12, OUTPUT); //Blauwe led
pinMode(11, OUTPUT); //Rode led
pinMode(10, OUTPUT); //Groene led
pinMode(9, OUTPUT); //Oranje flitslamp via relais
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

Serial.println("SMS Messages Receiver");

// connection state
boolean notConnected = true;

// Start GSM connection
while (notConnected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
} else {
Serial.println("Not connected");
delay(1000);
}
}

Serial.println("GSM initialized");
Serial.println("Waiting for messages");
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
}

void loop() {
char c;

// If there are any SMSs available()
if (sms.available()) {
Serial.println("Message received from:");

// Get remote number
sms.remoteNumber(senderNumber, 20);
Serial.println(senderNumber);

// An example of message disposal
// Any messages starting with # should be discarded
if (sms.peek() == '#') {
Serial.println("Discarded SMS");
sms.flush();
}

// Read message bytes and print them
while (c = sms.read()) {
Serial.print(c);

char code1 = 501964;
char code2 = 834719;

if (c = code1) {
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
Serial.println("Bom ontmanteld");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
} else if (c = code2) {
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
Serial.println("Bom ontmanteld");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
} else {
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom ontploft");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
}
}

Serial.println("\nEND OF MESSAGE");

// Delete message from modem memory
sms.flush();
Serial.println("MESSAGE DELETED");
}

delay(1000);

}


Het gaat om het gedeelte in de while loop van de sms functie.

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Receive SMS code probleempje

Berichtdoor nicoverduin » 03 Mei 2016, 12:04

Als je een vergelijking maakt met iets, moet je dat met == doen en niet een keer =.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Receive SMS code probleempje

Berichtdoor christiaan » 03 Mei 2016, 20:42

heb een extra = toegevoegd, echter zijn nu alle code's niet goed, en is de telkens de bom ontploft.

cpp code
// Read message bytes and print them
while (c = sms.read()) {
Serial.print(c);

char code1 = 501964;
char code2 = 834719;

if (c == code1) {
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
Serial.println("Bom ontmanteld");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
} else if (c == code2) {
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
Serial.println("Bom ontmanteld");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
} else {
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom ontploft");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
}
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Receive SMS code probleempje

Berichtdoor nicoverduin » 03 Mei 2016, 22:14

Dat klopt als een bus wat je zegt.
a) De code die je in een char wil stoppen is vele malen groter dan er in een char kan staan (max 255).
b) Je leest een teken van 8 bits en probeert dat te vergelijken met een van de codes.
Dat gaat allemaal niet werken.
Wat je moet doen is eerst alle tekens binnen lezen die in het bericht staan(dus in een char array).
Als deze 6 tekens zijn kun je controleren of deze gelijk zijn aan een van de codes die in je sketch staan (strcmp() functie)
Al je codes moet je in een char array zetten van 7 bytes elk (6 tekens + een \0.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Receive SMS code probleempje

Berichtdoor christiaan » 03 Mei 2016, 22:20

Kan je me op weg helpen met de code,

Probeer er wat van te leren, echter snap ik het niet helemaal.
Bedoel je dat ik een ieuw constante moet maken met de naam bijvoorbeeld message (die een char array [7] is)

En toen snapte ik het even niet meer.
Als je me op weg jan helpen heel graag, ik moet dit weekend krijgen voor dinsdag aanstaande namrkijk

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Receive SMS code probleempje

Berichtdoor christiaan » 04 Mei 2016, 03:56

Wat ik heb gedaan verdiend geen schoonheids prijs, maar het werkt wel:

Ik heb een String message aangemaakt (geen array), daar wordt de sms ingeladen qua text (message = c (c = SMS.read)) Vervolgens controleer ik via een if statement mijn message string met mijn 2 code's.

cpp code
/*
SMS receiver

This sketch, for the Arduino GSM shield, waits for a SMS message
and displays it through the Serial port.

Circuit:
* GSM shield attached to and Arduino
* SIM card that can receive SMS messages

created 25 Feb 2012
by Javier Zorzano / TD

This example is in the public domain.

http://www.arduino.cc/en/Tutorial/GSMExamplesReceiveSMS

*/

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER "0000"

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20];

String message;

void setup() {
// initialize serial communications and wait for port to open:
Serial.begin(9600);
pinMode(12, OUTPUT); //Blauwe led
pinMode(11, OUTPUT); //Rode led
pinMode(10, OUTPUT); //Groene led
pinMode(9, OUTPUT); //Oranje flitslamp via relais
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

Serial.println("SMS Messages Receiver");

// connection state
boolean notConnected = true;

// Start GSM connection
while (notConnected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
} else {
Serial.println("Not connected");
delay(1000);
}
}

Serial.println("GSM initialized");
Serial.println("Waiting for messages");
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
}

void loop() {
char c;

// If there are any SMSs available()
if (sms.available()) {
Serial.println("Message received from:");

// Get remote number
sms.remoteNumber(senderNumber, 20);
Serial.println(senderNumber);

// An example of message disposal
// Any messages starting with # should be discarded
if (sms.peek() == '#') {
Serial.println("Discarded SMS");
sms.flush();
}

// Read message bytes and print them
while (c = sms.read()) {
//Serial.print(c);
message += c; // build the message from the sms.read() function
Serial.println(message);
}

Serial.println("\nEND OF MESSAGE");


// Delete message from modem memory
sms.flush();
Serial.println("MESSAGE DELETED");
if (message == "501964") {
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
Serial.println("Bom ontmanteld");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
message = "";
} else if (message == "834719") {
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
Serial.println("Bom ontmanteld");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
message = "";
} else {
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom ontploft");
delay(6000);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
Serial.println("Bom actief");
message = "";
}
}

delay(1000);

}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Receive SMS code probleempje

Berichtdoor nicoverduin » 04 Mei 2016, 06:56

Geen probleem.. Als je het lang genoeg gebruikt, klapt hij er vermoedelijk vanzelf wel uit..... String werkt niet goed op de Arduino omdat er geen zgn. "Garbage collection is". Elke keer als er een teken bij komt wordt er nieuwe RAM gealloceerd. In jouw geval dus 2+3+4+5+6+7 = 27 bytes. Die komt door de structuur van je programma niet meer terug. Dus na pak'm beet 80-90 keer een nummer inbrengen hangt je Arduino. Daarom gaf ik char aan en geen String.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Receive SMS code probleempje

Berichtdoor christiaan » 04 Mei 2016, 06:58

Ik heb ook aangegeven dat ik je niet helemaal snapte, en hulp erbij wou hebben. Toen heb ik zelf deze oplossing eerst gevonden, zodat het nu werkt.
Prima dat je aangeeft dat hij na verloop van inputs dat hij dan niet reageert meer.

Zou je me kunnen en willen helpen om het dan om te zetten in char functie???

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Receive SMS code probleempje

Berichtdoor nicoverduin » 04 Mei 2016, 07:08

Die string vervangen voor een char array. dus bijv.
cpp code
char message[7];

(of afhankelijk hoelang het bericht is.

De message leegmaken:
cpp code
message[0] = '\0';


lezen van de tekens:
cpp code
// Read message bytes and print them
uint8_t i = 0;
while (c = sms.read()) {
//Serial.print(c);
message[i] = c; // build the message from the sms.read() function
message[i+1] = '\0';
i++;
Serial.println(message);
}


Vergelijken van een string
cpp code
if (strcmp(message,"501964") == 0) {
etc......
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Receive SMS code probleempje

Berichtdoor christiaan » 04 Mei 2016, 07:11

Dank je nico,

het bericht is ten alle tijde 6 karakters, omdat er maar 6 cijfers mogen worden verstuurd.

Snap alleen die vergelijking van de string niet, is die 0 aan het eind omdat hij niet gelijk aan is, of zie ik dat verkeerd?

Ik ga vanmiddag de code even veranderen en testen.
Maar alvast bedankt voor je hulp.

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten