In: Computer Science
Write an Arduino code that calls a web service to show the location of the iss after a couple of seconds and displays in on an LCD
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "printf.h" #include <string.h> #include <Servo.h> #include <Stepper.h> // Definition des Pins CE, CSN pour le module NRF #define RF_CE 9 #define RF_CSN 10 // Definition des constantes du stepper #define STEPS 200 // Max steps for one revolution #define RPM 60 // Max RPM #define DELAY 20 int SVRO = 2; // PIN de controle du servo int commandeServo = 0; // commande du servo String respMsg; String msg; int steps = 0; // commande du moteur Stepper stepper(STEPS, 4, 5, 6, 7); // PIN du moteur Servo myservo; RF24 radio(RF_CE,RF_CSN); byte myID = 0x01; // Definition de l'id de l'Arduino byte pipes[][7] = {"master","slave","idle"}; struct payload_request_t { uint8_t number; uint8_t destination; char message[14]; }; struct payload_general_t { uint8_t number; char message[15]; }; payload_request_t incoming; payload_general_t outgoing; void sendReply() // fonction d'envoi de la reponse au raspberry { // affichage du message dans le moniteur Serial.print("Message de retour de la commande \""); Serial.print(outgoing.message); Serial.println("\""); radio.stopListening(); // envoi du message radio.openWritingPipe(pipes[1]); delay(10); radio.write(&outgoing,sizeof(payload_general_t)+1); delay(10); radio.startListening(); } void traitement(char *commande, int *servo, int *pas) // fonction qui separe la commande moteur de la commande du servo { // modele commande set=com_servo;com_mot String comServ = ""; String comMot = ""; int i=4; int n = strlen(commande); while(commande[i] != ';'){ // recuperation de la commande du servo comServ += commande[i]; i++; } i++; while(i<n){ // recuperation de la commande du moteur comMot += commande[i]; i++; } *servo = comServ.toInt(); *pas = comMot.toInt(); } void setup() { Serial.begin(9600); // Initialisation de la communication Serie stepper.setSpeed(RPM); // Parametre la vitesse du moteur myservo.attach(SVRO); myservo.write(0); // servo a l'angle 0 printf_begin(); radio.begin(); // initialisation de la communication NRF radio.setAutoAck(1); radio.setRetries(1,3); radio.enableDynamicPayloads(); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1, pipes[0]); radio.startListening(); radio.printDetails(); } void loop() { if(radio.available()) { radio.read(&incoming, sizeof(payload_request_t)); // Affichage de la commande demandee dans la console Serial.print("Commande recu \""); Serial.println(incoming.message); // Aduino verifie que c'est bien a son ID que la demande s'adresse if (incoming.destination==myID) { if (strncmp(incoming.message, "get", 3) == 0) { // Si le message est "get", on retourne la position du servo et la derniere commande du moteur msg = "S" + String(commandeServo) + "M" + String(steps); } else if (strncmp(incoming.message, "set", 3) == 0) { // Sinon si la commande est de type "set" traitement(incoming.message,&commandeServo,&steps); // On extrait les deux commandes if ((commandeServo < 0) || (commandeServo > 90)) { msg = "OORS "; // out of range servo } else { myservo.write(commandeServo); // on commande le servo // on prepare le message de retour msg = "S = " + String(commandeServo) + " "; } Serial.println(respMsg); if ((steps == 0) || (steps < 0 - STEPS) || ( steps > STEPS )) { msg += "OORM"; // out of range moteur } else { // on prepare le message de retour msg += "M = " + String(steps); delay(DELAY); if ( steps > 0) { // Sens trigo for (int i=0;i<steps;i++) { stepper.step(1); delay(DELAY); } } else { // Sens inverse for (int i=0;i>steps;i--) { stepper.step(-1); delay(DELAY); } } } // copie du message dans le message de retour msg.toCharArray(outgoing.message, 16); Serial.println(outgoing.message); } else { // Si la commande est de type inconnu strcpy(outgoing.message, "?"); } outgoing.number = incoming.number; sendReply(); // On envoie la reponse } } delay(100); }