Stap 4: Schrijven van de Code
Eerst en vooral, lees ik de MediaTek LinkIt een Developer's Guide, in het bijzonder de sectie over het ontvangen van sms'en, evenals de API. Ik heb de gids hier bijgevoegd in het geval deze link niet meer werkt.
Ik heb mijn volledige code hier, die moet gewoon werken bijgevoegd. Ik brak het speciaal in kleine functies die gemakkelijk moeten te begrijpen, ik ga door elk van hen hier. Lees de inline-opmerkingen ook voor extra info.
Globale variabelen initialiseren
#include <LGSM.h> //these variables are used for the LED int ledGreenPin = 13; //I am using the onboard LED as an indicator boolean ledGreenState = LOW; //this is the pin that is connected to the transistor base (via a resistor) int triggerPin = 12; //these variables are for the sms char smsContent[200]; int smsLength = 0; char smsSender[20]; //these variables are for the password const int passwordLength = 20; //number of possible characters in password, remember the null terminator const char password[passwordLength] = "mellon"; //this is the actual password
Setup functie
De setup-functie wordt één keer uitgevoerd nadat het apparaat is opgestart. De pin die de onboard beheert leidde (D13) en de pin verbonden aan van de transistor base (D12) zijn geïnitialiseerd als uitgang en ingesteld op de standaardwaarden van 0 ("LOW").
De seriële poort wordt geïnitialiseerd met een baudsnelheid van 9600, zodat de foutopsporingsinformatie kan worden uitgeprint.
De waitForSim() functie wordt eenmaal aangeroepen (wordt later beschreven)
void setup() { //this code runs once at setup pinMode(ledGreenPin, OUTPUT); //initialise LED pinMode(triggerPin, OUTPUT); //initialise PIN digitalWrite(ledGreenPin, ledGreenState); //turn LED off digitalWrite(triggerPin, LOW); //make sure trigger is off (assuming NPN transistor on a pullup input) Serial.begin(9600); //start the serial port waitForSim(); //wait for simcard to be active }
waitForSim() functie
De waitForSim() functie zit gewoon in een lus, controleren elke halve seconde, gedefinieerd door delay(500), of de SIM-kaart is klaar. De groene LED is uitgeschakeld op/elke controle zodat het knippert en dan links op eenmaal de SIM-kaart klaar is.
void waitForSim() { //this is just a function to wait until the SIM is ready Serial.print("waiting for sim"); while (!LSMS.ready()) { delay(500); ledGreenState = !ledGreenState; //blink the led digitalWrite(ledGreenPin, ledGreenState); Serial.print('.'); } ledGreenState = HIGH; //turn led on once SIM is ready digitalWrite(ledGreenPin, ledGreenState); Serial.println("Sim Ready"); }
receiveSms() functie
Deze functie zal controleren of er een nieuwe SMS. Als er een is, is het lezen in, één teken tegelijk en opgeslagen in de buffer smsContent. Als er geen nieuwe SMS retourneert de functie false. Dit kan we noemen het zo vaak als we in de hoofdlus.
Zodra de SMS heeft gelezen het is verwijderd met de opdracht flush().
boolean receiveSMS() { //this function will store a new sms in the buffers //or return false if there is no new sms int v; if (LSMS.available()) // Check if there is new SMS { Serial.println("There is new message."); LSMS.remoteNumber(smsSender, 20); // store sender in buffer smsLength = 0; //storing a new sms while (true) { v = LSMS.read(); if (v < 0) break; smsContent[smsLength] = v; smsLength++; } smsContent[smsLength] = '\0'; smsLength++; LSMS.flush(); // delete message return HIGH; } else { return LOW; } }
displaySMS() functie
Deze functie drukt gewoon de afzender en de inhoud buffers op de seriële poort, die handig is voor foutopsporing.
void displaySMS() { Serial.print("Sender:"); Serial.println(smsSender); Serial.print("Content:"); Serial.println(smsContent); Serial.println(); }
validatePassword() functie
Deze functie wordt gebruikt om het vergelijken van de inhoud van de SMS met de wachtwoordtekenreeks. Als de inhoud overeenkomt met de tekenreeks, dan is de functie als resultaat 1 (hoog), anders is het resultaat 0 (laag).
boolean validatePassword() { //this function will return true if the contents of the sms start with the defined password Serial.print("Comparing "); Serial.println(password); Serial.print("with "); Serial.println(smsContent ); if (strcmp(password, smsContent) == 0) { Serial.println("Password Valid"); return HIGH; } else { Serial.println("Password Invalid"); return LOW; } }
triggerRemote() functie
Functie die deze functie gewoon de D12 pin (transistor base) hoog voor een bepaalde hoeveelheid tijd (1 seconde werkte voor mij stelt, u afstandsbediening misschien liever iets anders)
void triggerRemote() { //this function will "turn on" the transistor that emulates a button press Serial.println("Emulating button press"); digitalWrite(triggerPin, HIGH); delay(1000); digitalWrite(triggerPin, LOW); Serial.println("Emulating button release"); }
loop functie
Deze functie is de kern van een Arduino-programma en loopt gewoon over en weer voor alle eeuwigheid. Aangezien alles reeds in functies opgesplitst heeft is het volledig spreekt voor zich.
void loop() { if (receiveSMS()) { displaySMS(); if (validatePassword()) { triggerRemote(); } } delay(1000); }