Bonjour à tous,

J'ai un problème au niveau de l'affichage dans la console pour une requête utilisant un substring.

J'utilise Tinkercad pour simuler l’environnement Arduino et tout fonctionne parfaitement dans celui-ci.

Par contre lorsque le sketch est joué dans l'Arduino cela ne fonctionne pas.

L'idée est de structurer la réception d'un SMS et effectuer un traitement adapté en fonction du contenu de celui-ci.

Par exemple la réception de "W_on 10" permet d'arroser pendant 10 minutes (sinon par défaut 7 minutes)
la réception du SMS se traite comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
void receive_message()
{
  if (SIM900.available() > 0)
  {
    incomingData = SIM900.readString(); // Get the data from the serial port.
    Serial.println(incomingData); 
    Serial.println(stringToLong(incomingData.substring(4)));
    //Serial.println(incomingData.substring(9,8));
    //Serial.println(incomingData.substring(11,10));
    delay(10); 
  }
}
Ce qui marche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Serial.println(incomingData);
affiche bien W_on 10,
Ce qui ne marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Serial.println(stringToLong(incomingData.substring(4)));
devrait m'afficher "10" mais en réalité il n'y a rien.

Un simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Serial.println(incomingData.substring(4));
ne m'affiche rien non plus.

Je ne vois pas ce qui cause le problème.

En vous remerciant pour l'aide.

Code complet:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
 
#include <SoftwareSerial.h> // Library for using serial communication
SoftwareSerial SIM900(3, 4); // Pins 3, 4 are used as used as software serial pins
//#define SIM900 Serial 
 
String incomingData;   // for storing incoming serial data
String message = "";   // A String for storing the message
 
int relay_pin = 2 ;    // Initialized a pin for relay module
int relay_pin2 = 5;    // Initialized a pin for relay module
String rtl;            // to start from pump 1 or pump 2 
String noMessage;      // if sending confirmation SMS
String noMessage2;     // if sending confirmation SMS
unsigned long previousMillis = 0;
long duration; // for storing pump working duration
 
void setup()
{
  delay(10000); //Wait for SIM800 initialisation
  Serial.begin(115200); // baudrate for serial monitor
  SIM900.begin(19200); // baudrate for GSM shield
 
  pinMode(relay_pin, OUTPUT);   // Setting relay pin as output pin
  digitalWrite(relay_pin, HIGH);  // Making relay pin initailly low
  pinMode(relay_pin2, OUTPUT);   // Setting relay pin as output pin
  digitalWrite(relay_pin2, HIGH);  // Making relay pin initailly low
 
  // set SMS mode to text mode
  SIM900.println("AT+CMGF=1\r");  
  delay(100);
 
  // set gsm module to tp show the output on serial out
  SIM900.println("AT+CNMI=2,2,0,0,0\r"); 
  delay(100);
 
 
}
 
void loop()
{
  //Function for receiving sms
  receive_message();
 
  rtl = incomingData.substring(9,8); //Check if "R" in SMS
 
  // if received command is to turn on relay
  if(incomingData.indexOf("W_on")>-1)
  {
 
      //if reverse command received  
      if(rtl == "R"){
       relay_pin = 5;
       relay_pin2 = 2; 
      }
   digitalWrite(relay_pin, LOW); //relay ON
 
    //Duration setup according SMS
    if(stringToLong(incomingData.substring(5))!= 0){
    duration = stringToLong(incomingData.substring(5));
    }
    else {
     duration = 7; 
    } 
 
 
    message = "Arrosage ON " + String(duration) + " minutes" ;
    // Send a sms back to confirm that the relay is turned on
    noMessage = incomingData.substring(11,10); //find "N" in SMS to send message or not
    noMessage2 = incomingData.substring(9,8); 
    if(noMessage != "N" && noMessage2 != "N" ){ 
    //  send_message(message);
    }
  previousMillis = millis();//reset counter
    incomingData = "";//empty message reception
 
  }
 
  // if received command is to turn off relay
  if(incomingData.indexOf("W_off")>-1)
  {
    digitalWrite(relay_pin, HIGH);
    digitalWrite(relay_pin2, HIGH);
    message = "Arrosage OFF";
    // Send a sms back to confirm that the relay is turned off
    send_message(message);
  incomingData = "";
  }        
 if ((digitalRead(relay_pin) == LOW) && (millis() - previousMillis >= (duration * 60000))){
   digitalWrite(relay_pin, HIGH);
   delay(500);
    digitalWrite(relay_pin2, LOW);
       previousMillis = millis();
    }
 
 
 
  if ((digitalRead(relay_pin2) == LOW) && (millis() - previousMillis >= (duration * 60000))){
   digitalWrite(relay_pin2, HIGH);
 
    message = "Arrosage OFF";
    // Send a sms back to confirm that the relay is turned off
     if(noMessage != "N" && noMessage2 != "N" ){ 
    send_message(message);
    }
 
  }
 
 
}
long stringToLong(String s)
{
   char arr[12];
   s.toCharArray(arr, sizeof(arr));
   return atol(arr);
}
 
 
 
void receive_message()
{
  if (SIM900.available() > 0)
  {
    incomingData = SIM900.readString(); // Get the data from the serial port.
    Serial.println(incomingData); 
    Serial.println(incomingData.substring(5));
    //Serial.println(stringToLong(incomingData.substring(4)));
    //Serial.println(incomingData.substring(9,8));
    //Serial.println(incomingData.substring(11,10));
    delay(10); 
  }
}
 
void send_message(String message)
{
  SIM900.println("AT+CMGF=1");    //Set the GSM Module in Text Mode
  delay(100);  
  SIM900.println("AT+CMGS=\"+123456\""); 
  delay(100);
  SIM900.println(message);   // The SMS text you want to send
  delay(100);
  SIM900.println((char)26);  // ASCII code of CTRL+Z
  delay(100);
  SIM900.println();
  delay(1000);  
}