Compatibilté sketch

Bonjour
Ce sketch ce compile parfaitement pour une carte nano mais lorsque je le compile pour un XIAO j'ai cette erreur :

In file included from /Users/abc/Library/Arduino15/packages/Seeeduino/hardware/samd/1.8.5/cores/arduino/WString.h:29:0,
from /Users/abc/Library/Arduino15/packages/Seeeduino/hardware/samd/1.8.5/cores/arduino/Print.h:27,
from /Users/abc/Library/Arduino15/packages/Seeeduino/hardware/samd/1.8.5/cores/arduino/Stream.h:26,
from /Users/abc/Documents/Arduino/libraries/SoftwareSerial/SoftwareSerial.h:36,
from /Users/abc/Documents/Arduino/libraries/GPRS_SIM900/sim900.h:35,
from /Users/abc/Documents/Arduino/libraries/GPRS_SIM900/GPRS_Shield_Arduino.h:35,
from /Users/abc/Documents/Arduino/libraries/GPRS_SIM900/GPRS_Shield_Arduino.cpp:33:
/Users/abc/Documents/Arduino/libraries/GPRS_SIM900/GPRS_Shield_Arduino.cpp: In member function 'int16_t GPRS::httpSendGetRequest(const __FlashStringHelper*, const char*, const __FlashStringHelper*, uint8_t, const __FlashStringHelper* const*, const char* const*, uint16_t)':
/Users/abc/Library/Arduino15/packages/Seeeduino/hardware/samd/1.8.5/cores/arduino/avr/pgmspace.h:105:61: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
#define pgm_read_word(addr) ((const unsigned short )(addr))
^
/Users/abc/Documents/Arduino/libraries/GPRS_SIM900/GPRS_Shield_Arduino.cpp:1244:52: note: in expansion of macro 'pgm_read_word'
tempParamKey = (const __FlashStringHelper
)pgm_read_word(&queryParameterKeys[i]);
^~~~~~~~~~~~~
/Users/abc/Documents/Arduino/libraries/GPRS_SIM900/GPRS_Shield_Arduino.cpp: In member function 'bool GPRS::httpReadResponseData(char
, uint16_t)':
/Users/abc/Documents/Arduino/libraries/GPRS_SIM900/GPRS_Shield_Arduino.cpp:1309:83: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (sim900_read_string_until(receiveBuffer, sizeof(receiveBuffer), "\r\n") == false) {
^~~~~
Plusieurs bibliothèque trouvées pour "SoftwareSerial.h"
Utilisé: /Users/abc/Documents/Arduino/libraries/SoftwareSerial
Non utilisé: /Users/abc/Library/Arduino15/packages/Seeeduino/hardware/samd/1.8.5/libraries/SoftwareSerial
exit status 1

Compilation error: exit status 1

Mon sketch :

// ***************************************************
// SIM900 (TX) - XIAO (D0)
// SIM800L (RX) - XIAO (D1)
// DHT22 (A6)
// RESET nano (D2)
// ENTREE contact alarme (A3)
// affichage de REDEMARRAGE sur gsm à chaque relancement de la XIAO
// affichage de RESET VOLONTAIRE su gsm lors de l'envoi de l'ordre "R"
// Lancement de la mesure par "T"
// lancement du reset volontaire par "R"
// LED verte 9 ON = GSM OK - prêt à recevoir des ordres
// LED jaune 8 ON = TRAFFIC GSM
// LED rouge 7 ON = GSM NOK ou INTRUSION
// ***************************************************

#include <Wire.h>
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>

// *** TEMPERATURE *****
// *********************
#include "DHT.h"
#define brocheDeBranchementDHT A6            // pine de mesure DHT22
#define typeDeDHT DHT22                      // type de DHT utilisé
DHT dht(brocheDeBranchementDHT, typeDeDHT);  // Instanciation de la librairie DHT

// ****HORLOGE ****
// ****************
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include "RTClib.h"  //library DS1307

RTC_DS1307 rtc;
char NomJour[7][12] = { "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" };
char NomMois[12][12] = { "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre" };
String jour, moisMod;
int date, mois, annee, heure, minute, seconde;

char phone[16];
char datetime[10];

int humMesuree;
int tempMesuree;

String TEMP;
String HUM;
String REDEM;
String REDEMVOL;
String PRET;
String DANGER;
String DateAlarm;
String DHTdefaut;
String FININTRUSION;
String INTRUSION;

int State = 0;
int X = 0;

String jourMod;
String DATEjour;
String DATEmois;
String DATEannee;
String DATEmod;
String HEUREmod;
String MOISmod;

#define PIN_TX 1
#define PIN_RX 0
#define BAUDRATE 57600
GPRS gprs(PIN_TX, PIN_RX, BAUDRATE);  //RX,TX,PWR,BaudRate

#define PHONE_NUMBER "+32474611688"
#define MESSAGE_LENGTH 10
char message[2];
int messageIndex = 0;

//***************************************************
void setup() {

  LED_JAUNE_ON();

  // vitesse moniteur
  Serial.begin(9600);

  // attribution des pines
  pinMode(A3, INPUT);  // alarme intrusion
  pinMode(9, OUTPUT);  // led verte
  pinMode(7, OUTPUT);  //led jaune
  pinMode(8, OUTPUT);  //led rouge

  if (!rtc.begin()) {
    Serial.println("recherche RTC");
    Serial.flush();
    while (1) delay(10);
  }

  //chargement de l'heure et date dans le DS3231 choisi une des deux options
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  //rtc.adjust(DateTime(2025, 04, 9, 18, 20, 0)); //année,mois,jour, heure,minutes,secondes

  //activation du DHT22;
  dht.begin();
  delay(1000);

  // Test connexion GSM
  gprs.checkPowerUp();
  while (!gprs.init()) {
    LED_ROUGE_ON();  //LED rouge ON = GSM non ok
  }
  LED_ROUGE_OFF();

  //envoi vers gsm de la signalisation du reboot du systeme
  REDEM = "Redemarrage\n \n *** PRET *** \n \n T= ordre Temperature\n R= ordre reset Nano\n";
  ENVOI(REDEM);  // envoi du SMS REBOOT
  delay(1000);
  LED_JAUNE_OFF();
  //LED verte ON = ready prêt recevoir des ordres
  LED_VERTE_ON();
}

//********************************************
void loop() {

  messageIndex = 0;
  // lecture du buffer messages du gsm
  messageIndex = gprs.isSMSunread();
  // test de la presence d'au moins d'un ordre envoyé
  if (messageIndex > 0) {
    gprs.readSMS(messageIndex, message, 10, phone, datetime);
    gprs.deleteSMS(messageIndex);  //suppression de l'ordre envoyé pour ne pas saturer la memoire de la carte SIM
    Serial.print(message[0]);

    //switch (message[0]) {
    if (message[0] == 'T') {

      //case 'T':
      DATE();
      //LED jaune ON = réception de l'ordre de mesure T° et humidité
      LED_JAUNE_ON();

      // Lecture des données
      humMesuree = dht.readHumidity();      // Lecture du taux d'humidité (en %)
      tempMesuree = dht.readTemperature();  // Lecture de la température, exprimée en degrés Celsius

      // Vérification si les mesures se font
      if ((humMesuree == 0) || (tempMesuree == 0)) {
        DHTdefaut = " DHT22 defecteux - redemarrer";
        ENVOI(DHTdefaut);  // envoi du sms "READY"REDEMVOL = " Reset volontaire";
        return;            // Si aucune valeur n'a été reçue par l'Arduino, on attend 2 secondes, puis on redémarre la fonction loop() pou une retentative
      }

      // detection alarme gel
      if (tempMesuree < 40) {
        DANGER = "\n *** GEL *** \n\r";
      }
      // préparation String pour envoi des valeurs T° et humidité vers GSM
      String TEMP;
      TEMP.reserve(100);
      TEMP += "Temperature (degres) = ";
      TEMP += tempMesuree;
      TEMP += "\n Humidite (%) = ";
      TEMP += humMesuree;
      TEMP += "\n\n " + jourMod + " " + date + " " + moisMod + " " + annee + " " + heure + ":" + minute + "\n";
      TEMP += DANGER;
      TEMP += " T= ordre Temperature\n R= ordre reset Nano\n";
      ENVOI(TEMP);  // envoi du sms temperature
      LED_JAUNE_OFF();
      // break;
    }

    if (message[0] == 'R') {
      //LED JAUNE ON = ordre redémarrage reçu
      LED_JAUNE_ON();
      DateAlarm = "Redemarrage volontaire \n";
      ENVOI(DateAlarm);  // envoi du sms "Redemarrage volontaire"
      // envoi signal reset sur pro-mini
      RESET();
      //LED JAUNE OFF = extinction si reset fait
      LED_JAUNE_OFF();
    }
  }

  State = digitalRead(A3);
  if ((State == 1) & (X == 0)) {
    DATE();
    LED_ROUGE_ON();
    LED_JAUNE_ON();
    String INTRUSION;
    INTRUSION.reserve(100);
    INTRUSION += "INTRUSION\n\n" + jourMod + " " + date + " " + moisMod + " " + annee + " " + heure + ":" + minute + "\n";
    ENVOI(INTRUSION);
    LED_JAUNE_OFF();
    LED_ROUGE_OFF();
    X = 1;
  } else if ((State == 0) & (X == 1)) {
    DATE();
    String FININTRUSION;
    FININTRUSION.reserve(100);
    FININTRUSION += "FIN INTRUSION\n\n" + jourMod + " " + date + " " + moisMod + " " + annee + " " + heure + ":" + minute + "\n" + "\n";
    FININTRUSION += " T= ordre Temperature\n R= ordre reset Nano\n";
    ENVOI(FININTRUSION);
    LED_JAUNE_OFF();
    LED_ROUGE_OFF();
    X = 0;
  }
}



//*******************************************
void ENVOI(String OBJET) {
  gprs.sendSMS(PHONE_NUMBER, OBJET.c_str());  // envoi du SMS OBJET
  delay(1000);
}
void LED_VERTE_ON() {
  digitalWrite(9, HIGH);
}
void LED_VERTE_OFF() {
  digitalWrite(9, LOW);
}
void LED_JAUNE_ON() {
  digitalWrite(8, HIGH);
}
void LED_JAUNE_OFF() {
  digitalWrite(8, LOW);
}
void LED_ROUGE_ON() {
  digitalWrite(7, HIGH);
}
void LED_ROUGE_OFF() {
  digitalWrite(7, LOW);
}
void RESET() {
  pinMode(2, OUTPUT);  // reset
  digitalWrite(2, HIGH);
}
void DATE() {
  DateTime now = rtc.now();
  jourMod = NomJour[now.dayOfTheWeek()];
  date = now.day();
  moisMod = NomMois[now.month() - 1];
  annee = now.year();
  heure = now.hour();
  minute = now.minute();
  seconde = now.second();
}

1 Like

Veuillez utiliser la langue anglaise dans les sections anglaises du forum. Votre sujet a été déplacé vers la section française du forum.

XIAO c'est une ligne de produit, ce n'est pas une seule carte donc il faut préciser le modèle.

Si on en croit le compte-rendu de compilation le processeur doit être un SAMD21.
Les fonctions qui sont rejetées ( FlashStringHelper et pgm_read_word) sont typiquement AVR donc elles sont inconnues sur la plateforme pour laquelle tu compiles.
La dernière est un problème de type incompatible tu compares un pointeur avec integer.

  1. une seule carte XIAO est proposée dans la liste des cartes SAMD

  2. Je ne vois pas quelles sont les lignes concernées par "FlashStringHelper" et "pgm_read_word" ?

Bonsoir

une seule carte XIAO est proposée dans la liste des cartes SAMD

En effet mais ton message initial ne mettait pas en évidence le fait que tu utilises une carte XIAO SAMD21, il existe aujourd'hui 12 types de cartes Xiao et la liste ne cesse de s'allonger !

https://www.seeedstudio.com/xiao-series-page

Je ne vois pas quelles sont les lignes concernées par "FlashStringHelper" et "pgm_read_word"

probablement celle-ci , avec l'utilisation de la macro F () pour forcer içi deux écritures en mémoire Flash pour 'économiser de la RAM'

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Ma version est bien celle SAMD21

Non ce n'est pas cette ligne qui poserait probleme car dans ce sketch simplifié qui l'utilise, la compilation sur XIAO est ok et le sketch fonctionne

// *** TEMPERATURE *****
// *********************
#include <Wire.h>
#include "DHT.h"
//#include <Adafruit_GFX.h>
//#include <Adafruit_SSD1306.h>
#define DHTTYPE DHT22
//Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);
unsigned long delayTime;
uint8_t DHTPin = A6;
DHT dht(DHTPin, DHTTYPE);
float Temperature;
float Humidity;
float Temp_Fahrenheit;

// ****HORLOGE ****
// ****************
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include "RTClib.h"

RTC_DS1307 rtc;

char NomJour[7][12] = { "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" };
char NomMois[12][12] = { "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre" };

String moisMod;
String jourMod;
int date, jour, mois, annee, heure, minute, seconde;
String DateAlarm;



  void setup() {
    Serial.begin(9600);
    // ***** TEMPERATURE *******
    // *************************
    pinMode(DHTPin, INPUT);
    dht.begin();
  
    // *** HORLOGE ******
    // ******************
    if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }

  //chargement de l'heure et date dans le DS3231
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // chargement l'heure de la compilation
  //rtc.adjust(DateTime(2014, 1, 21, 3, 4, 0)); // chargement manuelle de l'heure
  
  }
void loop(){
  // ***** TEMPERATURE ******
  // ************************
  Humidity = dht.readHumidity();
  // Read temperature as Celsius (the default)
  Temperature = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  Temp_Fahrenheit = dht.readTemperature(true);
  // Check if any reads failed and exit early (to try again).
  if (isnan(Humidity) || isnan(Temperature) || isnan(Temp_Fahrenheit)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  Serial.print(F("Humidity: "));
  Serial.print(Humidity);
  Serial.print(F("%  Temperature: "));
  Serial.print(Temperature-1.5);
  Serial.println(F("°C "));
  delay(10000);

  // ***** HORLOGE ******
  // ********************
  DateTime now = rtc.now();

    jourMod = NomJour[now.dayOfTheWeek()];
    date = now.day();
    moisMod = NomMois[now.month() - 1];
    annee = now.year();
    heure = now.hour();
    minute = now.minute();
    seconde = now.second();

    DateAlarm = String() + jourMod + " " + date + " " + moisMod + " " + annee + " " + heure + ":" +(minute<10? "0":"")+ minute;
    Serial.print(DateAlarm);
  
    Serial.println();
    delay(3000);
  }

La bibiothèque GPRS Shield est ancienne, est-elle compatible avec une carte Xiao SAMD21 , c'est douteux.

sur le dépot Github on peut lire :

'Compatible with standard Arduino and Arduino Mega'

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.