Bonjour,
je suis tout petit débutant et je tente d'envoyer des données sur une google sheet en utilisant un arduino et un sim900.
J'ai trouvé ce code sur le forum dans lequel j'ai simplement mis l'url de ma feuille. Mais ca ne fonctionne pas.
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
int temp = 0;
int niveau = 0;
void setup()
{
pinMode(A0, INPUT);
pinMode(A1, INPUT);
//Allumer la carte SIM900
pinMode(9, OUTPUT);
gprsSerial.begin(9600);
delay(300);
Serial.begin(9600);
delay(300);
Serial.println("Activation");
digitalWrite(9, HIGH);
delay(2000);
toSerial();
}
void loop()
{
Serial.println("boot");
gprsSerial.flush();
Serial.flush();
delay(500);
// cherche le nombre de reseau mobile
gprsSerial.println("AT+CGATT?");
delay(2000);
toSerial();
// Profil GPRS
gprsSerial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
delay(2000);
toSerial();
// Config APN
gprsSerial.println("AT+SAPBR=3,1,\"APN\",\"free\"");
delay(2000);
toSerial();
// Connection au GPRS
gprsSerial.println("AT+SAPBR=1,1");
delay(2000);
toSerial();
// initialisation du service HTTP
gprsSerial.println("AT+HTTPINIT");
delay(2000);
toSerial();
// configuration du service HTTP
gprsSerial.println("AT+HTTPPARA=\"CID\",1");
delay(2000);
toSerial();
// adresse serveur
gprsSerial.print("AT+");
gprsSerial.print("HTTPPARA=\"URL\",");
gprsSerial.print("https://script.google.com/macrosxxxxx/exec?func=addData&val1=1&val2=2&val3=15&val4=Bordettes"); // envoi des variables
gprsSerial.print("?temp=");
gprsSerial.print(temp);
gprsSerial.print("&niveau=");
gprsSerial.print(niveau);
gprsSerial.println("\"");
delay(2000);
toSerial();
// Lancer la session
// 0 = GET, 1 = POST, 2 = HEAD
gprsSerial.println("AT+HTTPACTION=0");
delay(2000);
toSerial();
// lis les donnees
gprsSerial.println("AT+HTTPREAD");
delay(6000);
// delay(10000UL); // 10 secondes
toSerial();
//Fermer la session
gprsSerial.println("");
gprsSerial.println("AT+HTTPTERM");
toSerial();
delay(2000);
gprsSerial.println("");
delay(2000);
temp = digitalRead(A0);
Serial.print("temp = ");
Serial.println(temp);
niveau = digitalRead(A1);
Serial.print("niveau = ");
Serial.println(niveau);
delay(2000);
}
void toSerial()
{
const uint32_t timeout = 2000UL;
uint32_t t0 = millis();
while (millis() - t0 <= timeout) {
if (gprsSerial.peek() != -1) {
Serial.write(gprsSerial.read());
}
}
}
Bonjour,
il faut donner plus d'informations .
pour trouver ce qui ne fonctionne pas, il faut suivre dans la console arduino les messages qui remontent du sim900 et voir a quel moment, il renvoie un code erreur ?
comment est cablé le sim900 ?
les xxxx sont bien remplacés par tes informations personnelles ?
il faudrait que tu modifies ton programmes en ajoutant des lignes de debugage afin de remonter des infos à la console chaque fois qu'une action est réalisée.
je ne connais pas ton niveau en programmation (tu as mis "tout petit debutant"), mais envoyer les valeurs d'une entrée analogique vers une page google sheet via une connection GPRS est d'un bon niveau.
tu peux essayer d'envoyer tes données vers un service plus simple que google sheet par exemple thinkspeak .
il semble bien que le code que tu as repris te fait buter sur la commande AT+CGATT?
// cherche le nombre de reseau mobile
gprsSerial.println("AT+CGATT?");
delay(2000);
toSerial();
Tu ne laisses ici que 2 secondes à Freemobile pour répondre à travers le SIM900
Augmenter à une dizaine de secondes pourrait peut être arranger un peu les choses et voir au moins sur le terminal à quoi ressemble la réponse (OK ? ou pas ?)
Avec cette commande tu demandes à Freemobile (via le réseau Orange...) s'il t'a connecté au servive GPRS, laisses le répondre avant de continuer
De manière plus générale ce code de style 'au pif' n'est pas du tout robuste puisqu'il n'analyse pas les réponses du SIM900 aux commandes AT envoyées. Une commande AT est un dialogue, ne pas attendre dans le code un OK avant de lancer la commande suivante ouvre grand la porte aux dysfonctionnements
Si j'ose dériver un peu, de mon point de vue l'ignorance du code retour de n'importe quelle fonction appelée est une très mauvaise idée.
C'est souvent l'erreur que font les "débutants" et encore plus lorsqu'il récupère du code YouTube qui n'a pas pour but d'être réellement fonctionnel mais démonstratif.
Il en va souvent de même pour les exemples de démonstrations d'une API, qui pour ne pas noyer le nouvel utilisateur dans du code rébarbatif, ne traite pas les codes retours.