TXT mig (3 / 3 steg)
Steg 3: Arduino koden
/ * TEXT MIG
Denna skiss för Arduino GSM shield, väntar på ett SMS-meddelande och visar det genom den seriella porten och på Kims TEXT ME maskin.
Lite kod från Javier Zorzano / TD http://arduino.cc/en/Tutorial/GSMExamplesReceiveSMS * /
/******************************************************************************************
* T H E C I R C U I T
*
* En extern strömkälla är obligatoriskt, annars fungerar inte GSM sköld
* GSM skölden är ansluten till en Arduino Uno
* Det finns två servon båda anslutna till GND och + 5V * roterande servo kontroll linjen går till stift 5
* Den vertikala servo kontroll linjen går till pinne 10
* Ready-lampan går till stift 11 via en 200 ohms motstånd
*******************************************************************************************/
#include / / include GSM biblioteket
#include / / include servo biblioteket
#define PINNUMBER "XXXX" / / nåla fast antal för GSM SIM-kort
#define rotaryPin 5 / / Anslut stift 5 till roterande servo
#define verticalPin 10 / / Anslut stift 10 till vertikala servo
#define readyLed 11 / / Anslut stift 11 till LED som visar att GSM-enhet är ansluten
GSM gsmAccess; Initialisera bibliotek instanser
GSM_SMS sms, char senderNumber [20]. Matrisen att hålla numret som ett SMS är Hämtad från
Servo rotaryServo; Skapa objekt för att styra roterande servo servo
Servo verticalServo; Skapa objekt för att styra vertikala servo servo
int rotation [] = {161, 154, 148, 142, 136, 130, 124, 118, 112, 105, 99, 92, 85, 78, 72, 66, 60, 54, 48, 42, 36, 30, 24, 19, 12, 7};
int numberOfLetters = 26.
int currentServoPosition;
int newServoPosition;
int upp = 170; Definiera två ytterligheter av vertikala servo
int ner = 117;
int inactivityTimer = 0;
/**************************************************************************************
* Ställ in
**************************************************************************************/
void setup()
{
Serial.BEGIN (9600); Initialisera seriell kommunikation på 9600 rotary
Servo.attach (rotaryPin); Fästa vertikal roterande servo
Servo.attach (verticalPin); Bifoga finger servo boolesk
notConnected = sant; GSM anslutningsstatus
parkArm(); Flytta till en säker plats om inte där redan
prompt();
parkArm(); Flytta till en säker plats
samtidigt (notConnected) / / vänta tills GSM-anslutning har upprättats
{
digitalWrite (readyLed, låg); Inaktivera ready-lampan
om (gsmAccess.begin (PINNUMBER) == GSM_READY) notConnected = false;
annat
{
Serial.println ("inte ansluten");
fördröjning (1000);
}
}
Serial.println ("GSM initieras"). Förtroende byggnaden meddelande
Serial.println ("väntar meddelanden");
digitalWrite (readyLed, hög); // Turn the ready LED on} /**************************************************************************************
* Huvudloop
**************************************************************************************/
void loop()
{
char c;
Om det finns inga SMS finns med jämna mellanrum göra en show
inactivityTimer = inactivityTimer ++; Räkna för varje slinga
om (inactivityTimer > 300) / / ca 1 SEK per slinga
{
inactivityTimer = 0; Återställa tomer
prompt(); Uppmärksamma dig själv
}
Heartbeat på LED att visa det kretsar fortfarande looping
digitalWrite (readyLed, låg); Inaktivera ready-lampan
Delay(100); Att lampan inte lyser
digitalWrite (readyLed, hög); Slå ready-lampan på
Om det finns ett SMS
om (sms.available())
{
inactivityTimer = 0; Om meddelandet sedan återställa inaktivitet timer
Serial.println ("meddelande från:");
Läs meddelandebyte och skriva ut dem
While(c=SMS.Read())
{
raiseLetterArm (c). "Skriv ut" plexiglas vapen
}
SMS.flush(); Radera meddelande från modem minne
} delay(1000);
}
/**************************************************************************************
* Fråga någon i närheten
**************************************************************************************/
void prompt()
{
raiseLetterArm (84). "Skriv ut" TEXT ME plexiglas vapen
raiseLetterArm (69).
raiseLetterArm (88).
raiseLetterArm (84).
raiseLetterArm (77).
raiseLetterArm (69).
}
/**************************************************************************************
* Lägga armen ur harm's way
**************************************************************************************/
void parkArm()
{
rotaryServo.attach (rotaryPin); Bifoga roterande servo
newServoPosition = 180; Parken där armen kan göra någon skada när bytte på/av
currentServoPosition = 9; Se till att det är tydligt att det behövs en övergång
rotateServo(); Flytta den roterande servon
Delay(2000); Vänta på servo att komma dit
rotaryServo.detach (); Tiga saker
}
/**************************************************************************************
* Höja brev armen anges
**************************************************************************************/
void raiseLetterArm (int charEntered)
{
rotaryServo.attach (rotaryPin); Bifoga servo på stift
"A" är 65 'a' är 97 "Z" är 90
om ((charEntered < 65) || ((charEntered > 91) & & (charEntered < 97)) || (charEntered > 123))
{
Då är inte A till ö så gör ingenting - vänta lite
}
annat
{
Göra gemener till versaler
om (charEntered > 96)
{
charEntered = charEntered - 32.
}
om ((charEntered > 64) & &(charEntered < 91))
{
newServoPosition = rotation [charEntered - 65]; Ange vart du ska vända armen
rotateServo();
}
Visa vad har skickats:
Serial.Print ("du skickade mig: \'");
Serial.write(charEntered);
Serial.Print ("\" ASCII-värde: ");
Serial.println(charEntered);
pressDown ();
}
rotaryServo.detach (); Stoppa slumpmässiga rörelser}
/*********************************************************************************
* Tryck fingret ner - se till att det är upp innan du återvänder
!*********************************************************************************/
void pressDown()
{
verticalServo.attach (verticalPin); Bifoga finger servo
Delay(500);
för (int jag = 0; jag < upp-ner, i ++)
{
verticalServo.write upp-i. Finger ner en grad i taget
Delay(10);
}
Delay(2000);
för (int jag = 0; jag < upp-ner, i ++)
{
verticalServo.write (down + i); Finger upp en grad i taget
Delay(10);
}
Delay(500);
verticalServo.detach (); Stoppa slumpmässiga rörelser}
/*********************************************************************************
* Flytta armen - se till att fingret är upp innan du använder it *** /
void rotateServo()
{
int skillnad;
int noOfSlowSteps = 5; Nej var 5 grader att flytta långsamt
int waitForServo = 20; Minskar inte för mycket eller missar steg
verticalServo.attach (verticalPin); Bifoga finger servo
verticalServo.write (upp); Kontrollera att den är ur vägen
verticalServo.detach (); Lossa
skillnaden = newServoPosition - currentServoPosition;
om (skillnaden > noOfSlowSteps)
{
rotaryServo.write (newServoPosition - noOfSlowSteps); Snabbt flytta
currentServoPosition = newServoPosition - noOfSlowSteps; Obs ny plats}
om (skillnaden < -1 * noOfSlowSteps)
{
rotaryServo.write (newServoPosition + noOfSlowSteps); Snabbt flytta
currentServoPosition = newServoPosition + noOfSlowSteps; Obs ny plats
}
skillnaden = newServoPosition - currentServoPosition; Beräkna om skillnaden om (skillnad > 0)
Sedan långsamt öka nuvarande position tills skillnaden är 0
{
för (int jag = 0; jag < skillnad + 1; i ++)
{
rotaryServo.write (currentServoPosition + i);
fördröjning (waitForServo);
}
}
annat / / sedan långsamt minska nuvarande position tills skillnaden är 0
{
för (int jag = 0; jag < (-1 * skillnaden) + 1; i ++)
{
rotaryServo.write (currentServoPosition - jag);
fördröjning (waitForServo);
}
}
currentServoPosition = newServoPosition; Kom ihåg vart arm är}
/**********************************************************************************
* Vindrutetorkare test (bortkommenterad)
**********************************************************************************/
/ * för (brev = 0; brev < numberOfLetters; brev ++)
{
newServoPosition = rotation [märka]; Ange vart du ska vända armen
rotateServo();
Serial.Print ("rotation [märka]");
Serial.println (rotation [märka]);
}
Delay(5000);
för (brev = numberOfLetters; brev + 1 > 0; brev--)
{
newServoPosition = rotation [märka]; Ange vart du ska vända armen
rotateServo();
Serial.Print ("rotation [märka]");
Serial.println (rotation [märka]);
}
Delay(5000); */
/**********************************************************************************
/ * Att kalibrera roterande servo (bortkommenterad) - måste ställa in potpin
**********************************************************************************/
/*
Val = analogRead(potpin); läser värdet i potentiometern (värde mellan 0 och 1023)
Val = karta (val, 0, 1023, 0, 179); skala den att använda den med servo (värde mellan 0 och 180)
rotaryServo.write(val); anger servo skalad värde
Delay(15); väntar på servo att komma dit
skriva ut värdet du läsa:
Serial.println(val); */