Étape 3: L’Arduino code
/ * TEXTE MOI
Cette esquisse, pour le bouclier de l’Arduino GSM, attend un message SMS et l’affiche à travers le port série et sur la machine ME texte de Kim.
Un code de Javier Zorzano / TD http://arduino.cc/en/Tutorial/GSMExamplesReceiveSMS * /
/******************************************************************************************
* T H E C I R C U I T
*
* Une alimentation externe est obligatoire, sinon le bouclier GSM ne fonctionne pas
* Le bouclier GSM est embroché dans un Arduino Uno
* Il y a deux servos tous deux connectés au GND et + 5V * la ligne de commande rotative servo va à la broche 5
* La ligne de commande de servo vertical va à la broche 10
* Le voyant ready va à la broche 11 via une résistance de 200 ohms
*******************************************************************************************/
#include / / inclure la bibliothèque GSM
#include / / inclure la bibliothèque de servo
#define PINNUMBER « XXXX » / / broches pour la carte SIM GSM
#define rotaryPin 5 / / connecter la broche 5 sur le servo rotatif
#define verticalPin 10 / / relier la broche 10 à l’asservissement vertical
#define readyLed 11 / / Connect broche 11 à LED qui indique que l’unité GSM est connecté
GSM gsmAccess ; Initialiser les instances de la bibliothèque
GSM_SMS sms ; char senderNumber [20] ; Tableau pour stocker le numéro extraites d’un SMS
Servo rotaryServo ; Créer objet servo commande rotative servo
Servo verticalServo ; Créer objet servo servo verticale de contrôle
la rotation d’int [] = {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 = jusqu'à 170 ; Décrivez les deux extrêmes du servo vertical
int Bas = 117 ;
int inactivityTimer = 0 ;
/**************************************************************************************
* Mettre en place
**************************************************************************************/
void setup()
{
Serial.Begin (9600) ; Initialiser une communication série à 9600 rotatif
Servo.Attach (rotaryPin) ; Fixer le servo rotatif vertical
Servo.Attach (verticalPin) ; Fixer le servo de doigt booléenne
notConnected = true ; État de la connexion GSM
parkArm() ; Déplacer vers un espace sécurisé si pas là déjà
prompt() ;
parkArm() ; Déplacer vers un espace sécurisé
tandis que (notConnected) / / attendre jusqu'à obtention d’une connexion GSM
{
digitalWrite (readyLed, basse) ; Éteindre le voyant ready
Si (gsmAccess.begin (PINNUMBER) == GSM_READY) notConnected = false ;
d’autre
{
Serial.println ("non connecté") ;
retarder (1000) ;
}
}
Serial.println ("GSM initialisée") ; Message de bâtiment de confiance
Serial.println ("Waiting for messages") ;
digitalWrite (readyLed, HIGH) ; // Turn the ready LED on} /**************************************************************************************
* Boucle principale
**************************************************************************************/
void loop()
{
char c ;
S’il n’y a aucun SMS disponibles à intervalles réguliers, faire un spectacle
inactivityTimer = inactivityTimer ++ ; Avancez une boucle for each
Si (inactivityTimer > 300) / / environ 1 seconde par boucle
{
inactivityTimer = 0 ; Réinitialiser le tomer
prompt() ; Attirer l’attention sur vous-même
}
Rythme cardiaque sur LED pour montrer cette boucle toujours en boucle
digitalWrite (readyLed, basse) ; Éteindre le voyant ready
Delay(100) ; Fois que le voyant est éteint
digitalWrite (readyLed, HIGH) ; Allumer le voyant ready
S’il existe un SMS
Si (sms.available())
{
inactivityTimer = 0 ; Si le message puis réinitialisez minuteur d’inactivité
Serial.println ("Message reçu de:") ;
Lire les octets du message et les imprimer
while(c=SMS.Read())
{
raiseLetterArm (c) ; « Imprimer » aux armes de perspex
}
SMS.Flush() ; Supprimer le message de la mémoire du modem
} delay(1000) ;
}
/**************************************************************************************
* Inciter quelqu'un à proximité
**************************************************************************************/
Sub prompt()
{
raiseLetterArm (84) ; « Print » texte ME aux armes de perspex
raiseLetterArm (69) ;
raiseLetterArm (88) ;
raiseLetterArm (84) ;
raiseLetterArm (77) ;
raiseLetterArm (69) ;
}
/**************************************************************************************
* Mettre le bras hors de danger
**************************************************************************************/
Sub parkArm()
{
rotaryServo.attach (rotaryPin) ; Fixer le servo rotatif
newServoPosition = 180 ; Parc où le bras ne peut faire aucun mal lorsque allumée/éteinte
currentServoPosition = 9 ; Assurez-vous qu’il est clair qu’un déménagement est nécessaire
rotateServo() ; Déplacer le servo rotatif
Delay(2000) ; Attendez que le servo pour y arriver
rotaryServo.detach () ; Taire des choses
}
/**************************************************************************************
* Relevez le levier de la lettre indiqué
**************************************************************************************/
void raiseLetterArm (int charEntered)
{
rotaryServo.attach (rotaryPin) ; Fixer le servo sur la broche
« A » a 65 ans « a » est de 97 « Z » est 90
Si ((charEntered < 65) || ((charEntered > 91) & & (charEntered < 97)) || (charEntered > 123))
{
Alors n’est pas A à Z donc ne rien faire - attendre un peu
}
d’autre
{
Transformer les minuscules en majuscules
Si (charEntered > 96)
{
charEntered = charEntered - 32 ;
}
Si ((charEntered > 64) & &(charEntered < 91))
{
newServoPosition = rotation [charEntered - 65] ; Vers qui se tourner le bras la valeur
rotateServo() ;
}
Montrer ce qui a été envoyé :
Serial.Print ("vous m’avez envoyé: \'") ;
Serial.Write(charEntered) ;
Serial.Print ("\" valeur ASCII: ") ;
Serial.println(charEntered) ;
pressDown () ;
}
rotaryServo.detach () ; Arrêter les mouvements aléatoires}
/*********************************************************************************
* Poussez le doigt vers le bas – Assurez vous que c’est vers le haut avant de revenir
!*********************************************************************************/
Sub pressDown()
{
verticalServo.attach (verticalPin) ; Fixer le servo de doigt
Delay(500) ;
pour (int i = 0; i < haut-bas; i ++)
{
verticalServo.write (up-i) ; Doigt vers le bas d’un degré à la fois
Delay(10) ;
}
Delay(2000) ;
pour (int i = 0; i < haut-bas; i ++)
{
verticalServo.write (bas + i) ; Doigt jusqu'à un degré à la fois
Delay(10) ;
}
Delay(500) ;
verticalServo.detach () ; Arrêter les mouvements aléatoires}
/*********************************************************************************
* Déplacer le bras - de s’assurer que le doigt soit vers le haut avant d’utiliser TI *** /
Sub rotateServo()
{
différence d’int ;
int noOfSlowSteps = 5 ; Non de degrés pour se déplacer lentement était 5
int waitForServo = 20 ; Ne réduisez pas trop ou il manque des étapes
verticalServo.attach (verticalPin) ; Fixer le servo de doigt
verticalServo.write (vers le haut) ; Assurez-vous qu’il est de la route
verticalServo.detach () ; Se détacher
différence = newServoPosition - currentServoPosition ;
Si (différence > noOfSlowSteps)
{
rotaryServo.write (newServoPosition - noOfSlowSteps) ; Se déplacer rapidement
currentServoPosition = newServoPosition - noOfSlowSteps ; Noter la position nouvelle}
Si (différence < -1 * noOfSlowSteps)
{
rotaryServo.write (newServoPosition + noOfSlowSteps) ; Se déplacer rapidement
currentServoPosition = newServoPosition + noOfSlowSteps ; Noter la position nouvelle
}
différence = newServoPosition - currentServoPosition ; Recalculer la différence si (différence > 0)
Ensuite augmenter lentement la position actuelle jusqu'à ce que la différence est 0
{
pour (int i = 0; i < différence + 1; i ++)
{
rotaryServo.write (currentServoPosition + i) ;
retard (waitForServo) ;
}
}
else / / puis lentement diminuer la position actuelle jusqu'à ce que la différence est 0
{
pour (int i = 0; i < (-1 * différence) + 1; i ++)
{
rotaryServo.write (currentServoPosition - i) ;
retard (waitForServo) ;
}
}
currentServoPosition = newServoPosition ; N’oubliez pas lorsque le bras est}
/**********************************************************************************
* Test essuie-glace (commentée)
**********************************************************************************/
/ * pour (lettre = 0; lettre < numberOfLetters ; lettre ++)
{
newServoPosition = rotation [lettre] ; Vers qui se tourner le bras la valeur
rotateServo() ;
Serial.Print ("rotation [lettre]") ;
Serial.println (rotation [lettre]) ;
}
Delay(5000) ;
pour (lettre = numberOfLetters ; lettre + 1 > 0; lettre--)
{
newServoPosition = rotation [lettre] ; Vers qui se tourner le bras la valeur
rotateServo() ;
Serial.Print ("rotation [lettre]") ;
Serial.println (rotation [lettre]) ;
}
Delay(5000) ; */
/**********************************************************************************
/ * Pour calibrer le servo rotatif (commenté) - besoin de mettre potpin
**********************************************************************************/
/*
Val = analogRead(potpin) ; lit la valeur du potentiomètre (valeur comprise entre 0 et 1023)
Val = carte (val, 0, 1023, 0, 179) ; redimensionnez-la pour l’utiliser avec le servo (valeur comprise entre 0 et 180)
rotaryServo.write(val) ; définit la position du servo selon la valeur à l’échelle
Delay(15) ; attend que le servo pour y arriver
afficher la valeur que vous lisez :
Serial.println(Val) ; */