Salut à vous tous,
Dernièrement j'ai voulu téléverser un programme utilisant la librairie software serial sur un atmega328p, mais avant j'ai testé plusieurs programmes avec des leds et ça fonctionnait très bien sans le moindre problème, mais arrivé à la librairie software serial que j'utilise pour une sim 800l, ça ne marche pas du tout, alors que cette même sim 800l marche très bien avec un nano
Pour résumer
L'AT méga 328p fonctionne très bien (avec des leds Ect)
La sim 800l fonctionne très bien aussi ( et avec 2 arduino différents )
L'AT méga 328p branché à la sim 800l par le biais des broches digital 9 et 10 déclaré sur le software serial ne marche pas,
J'ai bien essayé d'inverser le rx et TX et de changer le branchement, j'ai essayé d'autre broches digital tels que (10,11) et (2,3) mais ça ne marche toujours pas
Je ne sais si ça serait mieux si j'envoyais le code mais en tout cas le voici
#include <SoftwareSerial.h>
SoftwareSerial sim800(10,9);
#define relais 5
#define LEDverte 7
#define LEDrouge 6
String smsStatus,senderNumber,receivedDate,msg;
boolean isReply = false;
void setup() {
Serial.begin(115200);
Serial.println("Arduino serial initialize");
sim800.begin(9600);
Serial.println("SIM800L software serial initialize");
pinMode(LEDverte, OUTPUT); //Relay 1
pinMode(LEDrouge, OUTPUT);
smsStatus = "";
senderNumber="";
receivedDate="";
msg="";
sim800.print("AT+CMGF=1\r"); //SMS text mode
delay(1000);
//delete all sms
sim800.println("AT+CMGD=1,4");
delay(1000);
sim800.println("AT+CMGDA= \"DEL ALL\"");
delay(1000);
for (unsigned int n=0;n<5;n++){
digitalWrite(LEDrouge,HIGH);
digitalWrite(LEDverte,HIGH);
delay (500);
digitalWrite(LEDrouge,LOW);
digitalWrite(LEDverte,LOW);
delay (100);
}
}
void loop() {
//////////////////////////////////////////////////
while(sim800.available()){
parseData(sim800.readString());
}
//////////////////////////////////////////////////
while(Serial.available()) {
sim800.println(Serial.readString());
}
//////////////////////////////////////////////////
} //main loop ends
//***************************************************
void parseData(String buff){
Serial.println(buff);
unsigned int len, index;
//////////////////////////////////////////////////
//Remove sent "AT Command" from the response string.
index = buff.indexOf("\r");
buff.remove(0, index+2);
buff.trim();
//////////////////////////////////////////////////
//////////////////////////////////////////////////
if(buff != "OK"){
index = buff.indexOf(":");
String cmd = buff.substring(0, index);
cmd.trim();
buff.remove(0, index+2);
if(cmd == "+CMTI"){
//get newly arrived memory location and store it in temp
index = buff.indexOf(",");
String temp = buff.substring(index+1, buff.length());
temp = "AT+CMGR=" + temp + "\r";
//get the message stored at memory location "temp"
sim800.println(temp);
}
else if(cmd == "+CMGR"){
extractSms(buff);
doAction();
//delete all sms
sim800.println("AT+CMGD=1,4");
delay(1000);
sim800.println("AT+CMGDA= \"DEL ALL\"");
delay(1000);
}
//////////////////////////////////////////////////
}
else{
//The result of AT Command is "OK"
}
}
//************************************************************
void extractSms(String buff){
unsigned int index;
index = buff.indexOf(",");
smsStatus = buff.substring(1, index-1);
buff.remove(0, index+2);
senderNumber = buff.substring(0, 13);
buff.remove(0,19);
receivedDate = buff.substring(0, 20);
buff.remove(0,buff.indexOf("\r"));
buff.trim();
index =buff.indexOf("\n\r");
buff = buff.substring(0, index);
buff.trim();
msg = buff;
buff = "";
msg.toLowerCase();
}
void doAction(){
if(msg == "nz4hy31e"){
digitalWrite(LEDverte, HIGH);
digitalWrite(relais, HIGH);
Serial.println(" vert has been ON");
digitalWrite(LEDrouge, LOW);
Serial.println(" rouge has been OFF");
}
else if(msg == "kp34io01"){
digitalWrite(LEDverte, LOW);
digitalWrite(relais, LOW);
Serial.println(" vert has been OFF");
digitalWrite(LEDrouge, HIGH);
Serial.println(" rouge has been ON");
}
smsStatus = "";
senderNumber="";
receivedDate="";
msg="";
}
Salut.
Il faudrait savoir ce que tu entends par Atmega328P.
Quel schéma, et surtout quel oscillateur ?
Il faudrait déjà tester un delay() de plusieurs secondes, afin de vérifier que l'oscillateur est bien pris en compte. Les fuses ont ils été bien programmés ?
Ça veut dire quoi "fuses" ?
Comme vous l'avez sans doute remarqué dans le code programme, les deux leds clignotent 5 fois à des intervalles précis, et il n'y a pas de problème sur ce point
Le code est une chose, mais un delay(10000) donne t'il un vraiment délai de 10s ?
Oui j'ai testé il n'y a pas de problème la dessus
Tu as testé comment ?
Pour qu'une transmission série s'effectue correctement, la précision de l'horloge doit être de 5%, 2.5% côté émetteur, 2.5% côté récepteur, mais on admet que 2% de part et d'autre permet d'avoir une marge correcte.
Il n'y a rien qui différencie une carte ARDUINO d'un ATMEGA328P muni de son oscillateur, mis à part la précision de l'oscillateur. Tu l'auras compris, je mets en doute ton oscillateur.
Vois -tu ce texte sur le serial monitor ?
Pour tester j'ai mis une led sur HIGH pendant 10 secondes et j'ai chronométré, du moins c'est ce que j'ai compris
Je ne peux pas accéder au serial monitor alors que je suis sur l'AT méga 328p il n'y a que sur arduino ou je peux y accéder
C'est à dire que tu ne parviens pas à écrire sur le serial monitor, ou que tu n'as pas de convertisseur USB / Série branché sur RX TX ?
Je ne sais pas comment y accéder, est ce qu'il suffit de les brancher ainsi ?
- de l'usb au vcc
- de l'usb au gnd
Les fils vert et blanc au rx et tx
Non, comme indiqué par @hbachetti il faut utiliser un convertisseur USB / Série branché sur RX TX.
Un module dans ce genre là, par exemple
Ah OK,
Cependant j'ai essayé autre chose, changer l'oscillateur ainsi que les deux condo, et ça a marché, même la librairie software serial a bien fonctionné, mais ce qui est étrange c'est que l'intégralité de l'AT méga a cessé de fonctionner juste après, même les leds ne clignotent plus au départ j'ai essayé de réimplanter le programme ArduinoISP et lors de la gravure de la séquence d'initialisation il m'affiche cela
avrdude : Expected signature for Atmega328p is 1E 95 0F
Double check chip, or use -F to override this check.
Erreur lors de la gravure de la séquence d'initialisation
C très étrange, je n'ai rien changé au cablage
Câblage à revérifier. Peut être un faux contact ?
Je ne pense pas qu'il s'agit d'un faux contact, j'ai pris environ une heure à m'en assurer à l'aide de mon multimetre ect, j'ai même refait le circuit en son intégralité
Il serait étonnant que l'ATMEGA328 ait été détérioré suite à un changement d'oscillateur.
Oh pitié pas ça,
Y'a-t-il un moyen pour vérifier histoire d'en avoir le cœur net ?
Mettre ton ATMEGA328 sur une UNO, si tu en possède une, et que les deux sont DIL.
en fait ça a remarché après avoir recommencé le câblage plusieurs fois, et changer d'oscillateurs, comme il y'a plusieurs connexions la probabilité d'un faux contact est très élevé même si je n'en ai pas remarqué un, je me demande des fois si le problème peut venir des breadbords qui ne sèrrent pas trop les pins lorsqu'ils y sont implantés
