Bonjour, j'ai un problème pour activer l'alarme par mon gsm, quand j'envoie #A0 par sms, cela doit activer l'alarme, et a l'inverse #A1 désactive l'alarme. Sur internet j'ai vu que l'on pouvait utiliser des BitClear, BitSet, BitRead. C'est ce que j'ai fait mais impossible d'allumer et de coller le relais.
Je ne trouve pas l'erreur. Si vous pouviez m'aider
Merci
bool activationalarme;
void loop()
if (bitRead(activationalarme, 0) == 1)
{
digitalWrite(Alarme, HIGH);
}
else if (bitRead(activationalarme, 0) == 0)
{
digitalWrite(Alarme, LOW);
}
if (inchar=='a')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
bitSet(activationalarme, 0);
Serial1.begin(9600);
Serial1.print("\r");
delay(1000);
Serial1.print("AT+CMGF=1\r");
delay(1000);
Serial1.print("AT+CMGS=\"+330000000\"\r");
delay(1000);
Serial1.print(" l'alarme est activée !\r");
delay(1000);
Serial1.write(26);
}
else if (inchar=='1');
{
bitClear(activationalarme, 0);
Serial1.begin(9600);
Serial1.print("\r");
delay(1000);
Serial1.print("AT+CMGF=1\r");
delay(1000);
Serial1.print("AT+CMGS=\"+3360000000\"\r");
delay(1000);
Serial1.print(" l'alarme est desactivée !\r");
delay(1000);
Serial1.write(26);
}
}
Déjà il manque une accolade après loop()
Tu testes inchar sans le lire -> sauf coup de bol tu ne rentres jamais dans le if (inchar=='a') ni dans le if (inchar=='1')
Formates correctement ton source, ça te permettra peut être de voir ces erreurs.
Déjà il manque une accolade après loop()
Tu testes inchar sans le lire -> sauf coup de bol tu ne rentres jamais dans le if (inchar=='a') ni dans le if (inchar=='1')
Formates correctement ton source, ça te permettra peut être de voir ces erreurs.
Les accolades son bien mises, c'est que une partie du programme que j'ai mis parcequ'il fait plus de 700 lignes ! ce qui m'embête c'est juste "prend la valeur de" et "compare le bit" pour activer ou désactiver le relais.
Merci pour ta réponse
Eh bien, il faut que tu cherches ailleurs car le test et le positionnement des bits est correct.
Par contre on peut s'interroger sur l'utilité de faire ça sur un booleen au lieu de faire activationalarme=true ou activationalarme=false.
kamill:
Eh bien, il faut que tu cherches ailleurs car le test et le positionnement des bits est correct.
Par contre on peut s'interroger sur l'utilité de faire ça sur un booleen au lieu de faire activationalarme=true ou activationalarme=false.
Je suis preneur d'un autre code qui marche autant sans passer par des BitClear, BitSet, BitRead....
Merci kamill de porter intérêt à mon post
if (bitRead(activationalarme, 0) == 1)
// a remplacer par
if (activationalarme)
if (bitRead(activationalarme, 0) == 0)
// a remplacer par
if (!activationalarme)
bitSet(activationalarme, 0);
// a remplacer par
activationalarme=true;
bitClear(activationalarme, 0);
// a replacer par
activationalarme=false;
Mais ça ne changera rien, puisque l'erreur est ailleurs
il faut vraiment faire un effort sur la présentation du code ... c'est une grosse source d'erreur ... et on s'y perd avec les accolades au milieu des lignes
en plus il y a une commande de formatage automatique dans l'IDE ... (ça n'efface rien mais ça présente mieux ton code)
ton problème est là : else if (inchar=='1');
avec le ; après le test ... tu ne fais rien quand tu as inchar=='1' ... efface ton ; et ca ira
B83s:
il faut vraiment faire un effort sur la présentation du code ... c'est une grosse source d'erreur ... et on s'y perd avec les accolades au milieu des lignes
en plus il y a une commande de formatage automatique dans l'IDE ... (ça n'efface rien mais ça présente mieux ton code)
ton problème est là : else if (inchar=='1');
avec le ; après le test ... tu ne fais rien quand tu as inchar=='1' ... efface ton ; et ca ira
Merci beaucoup B83s ça marche
Juste un point virgule........
Le plus fiable pour le programme c'est quoi ?
mettre un boolean ou bitClear,bitRead, bitSet ??
le plus fiable est d'écrire un programme proprement !
gestion de bit ou de variables ... il n'y en a pas un plus fiable que l'autre, mais dans ton cas, utilise des variables (boolean...) ... c'est plus simple à comprendre ... et moins source d'erreur.
On utilise généralement la manipulation de bits quand il faut gagner de la mémoire ... au lieu d'attribuer 8 variables (qui font au minimum 8 bits, même pour un boolean qui n'a que 2 états) à 8 "états" (par exemple des led on/off) on préfère utiliser les 8 bits d'une seule variable pour gérer les 8 "états" (bit 1 pour la led 1, bit 8 pour la led 8) ... et dans ce cas les fonctions bitset, bitclear et bitread sont bien pratiques
Je gère mon alarme avec un détecteur de mouvements, ça fonctionne correctement, quand je lui dis de couper l'alarme il ne détecte plus de passage et quand je mets l'alarme en route, il détecte.
Maintenant j'ai un autre problème : que je mets l'alarme en route, mon relais reste enclenché pendant 20 sec. Normal je lui ai demandé ça. mais justement, je ne veux pas je veux juste qu'il mette en route l'alarme sans activer le relais.
val = digitalRead(detection); // Lire la valeur d'entrée
if (val == HIGH) {
if (bitRead(activationalarme, 0) == 1)
{
digitalWrite(vsejourd, HIGH);
delay(20000);
}
} else {
digitalWrite(vsejourd, LOW); // turn LED OFF
if (bitRead(activationalarme, 0) == 0)
{
digitalWrite(vsejourd, LOW);
}
}
mets une valeur minime dans ton delai
de cette façon, tu pourras toujours rétablir le délai si un jour tu le veux.
ton code sera inchangé
delay(20000);
dfgh:
mets une valeur minime dans ton delai
de cette façon, tu pourras toujours rétablir le délai si un jour tu le veux.
ton code sera inchangé
delay(20000);
delay(10); (ms)
je fais fonctionner une sirène pendant 20 secondes, j'avais oublié de le préciser