Je souhaiterai allumer et éteindre une led à distance. Pour cela je dispose d'un émetteur/récepteur 433Mhz, d'une ATtiny85 et de 2 BP. Ma led se trouve sur mon arduino avec le récepteur. Et de l'autre coté, j'ai ma télécommande avec l'ATtiny85 + l'émetteur + les 2 BP.
Mon problème est lors de l'envoie, je n'arrive pas à envoyé les codes binaire à la suite, pouvez vous m'aider SVP. Merci d'avance de vos messages
// ---------- COTER ATtiny85 ---------- //
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
#define Bp0 0
#define Bp1 1
#define com 3
void setup()
{
vw_setup(2000);
//Initilisation + pullup des boutons
pinMode(Bp0, INPUT);
pinMode(Bp1, INPUT);
//Sortie emetteur 433MHz
vw_set_tx_pin(3);
}
void loop()
{
//Detection des appuies
if(digitalRead(Bp0) == LOW)
{
Send(1);
vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
delay(1000); // Et on attend 1s pour pas floode
}
if(digitalRead(Bp1) == LOW)
{
Send(2);
vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
delay(1000); // Et on attend 1s pour pas floode
}
}
int Send(int toSend)
{
if(toSend == 1)
{
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
}
if(toSend == 2)
{
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 0);
delay(50);
digitalWrite(3, 1);
delay(50);
digitalWrite(3, 0);
delay(50);
}
}
coté recepteur
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
int led = 40;
void setup() // Fonction setup()
{
vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
vw_set_rx_pin(46);
vw_rx_start(); // Activation de la partie réception de la librairie VirtualWire
pinMode(led, OUTPUT);
}
void loop() // Fonction loop()
{
uint8_t buflen = VW_MAX_MESSAGE_LEN;
uint8_t buf[buflen];
if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
{
for (int i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
{
if(buf[i] == '11100111100000')
{
digitalWrite(led, HIGH);
}
else if (buf[i] == '11100110001010')
{
digitalWrite(led, LOW);
}
}
}
}
- Edité par Sentinellexx 16 février 2013 à 14:32:32
j'ai rentrer ces codes dans l'ATTiny85 et l'arduino et j'ai rien du tout, ma lampe ne s'allume pas... bon après il se pourrai que j'ai mal fait mon code. parce que la honnêtement je ne sait pas pourquoi sa ne marche pas
J'ai également cette erreur quand je veut tester mon ATtiny85 pour faire clignoter une led :
Taille binaire du croquis : 756 octets (d'un max de 8 192 octets) avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85 avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
C'est normale ? en tout cas ma led clignote bien
Depuis tout a l'heur j'essaye d'allumer une led juste avec l'ATTiny85 et bizarrement sa ne marche pas
j'ai brancher un bp sur la pin3 de µC et la led sur la pin 0. dans mon programme j'ai mis que lorsque la pin3 est en HIGH, elle met en HIGH la pin0 et a mon grand étonnement sa ne marche pas... si vous pouvez m'éclairé sa serai simpas
- Edité par Sentinellexx 16 février 2013 à 17:27:38
Désoler de ne pas avoir répondu plus tôt, avec les cours, on est prit de court (ok je sort ...).
Bref, je commence :
Sentinellexx a écrit:
J'ai également cette erreur quand je veut tester mon ATtiny85 pour faire clignoter une led :
Taille binaire du croquis : 756 octets (d'un max de 8 192 octets) avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85 avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
C'est normale ? en tout cas ma led clignote bien
Normal, peut-être pas, mais ceux qui ont fait la librairie disent qu'il ne faut pas y prêter attention.
Sentinellexx a écrit:
Depuis tout a l'heur j'essaye d'allumer une led juste avec l'ATTiny85 et bizarrement sa ne marche pas
j'ai brancher un bp sur la pin3 de µC et la led sur la pin 0. dans mon programme j'ai mis que lorsque la pin3 est en HIGH, elle met en HIGH la pin0 et a mon grand étonnement sa ne marche pas... si vous pouvez m'éclairé sa serai simpas
Perso, j'ai souvent fait des erreurs de branchement pour ça, je te conseille de vérifier :
- Qu'il y est bien le programme ArduinoISP dans ton arduino
- Que tu as bien mis le condos du reset
- Que tu as bien branché tout ce qu'il faut (masse commune, alim, etc)
Le problème maintenant c'est la communication des modules. je précise que j'utilise la bibliothèque VirtualWire.
J'ai tester la communication avec se petit bout de code pour aisseyer mais y'a rien qui s'affiche du coter de l'arduino.
Code Emetteur (ATtiny85) :
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
char *msg = "0"; // Tableau qui contient notre message
#define LED 1
void setup() // Fonction setup()
{
vw_setup(2400); // initialisation de la librairie VirtualWire à 2400 bauds (note: je n'utilise pas la broche PTT)
vw_set_tx_pin(0); // On indique que l'on veut utiliser la pin 0 de l'Arduino pour reçevoir
pinMode(LED, OUTPUT);
}
void loop() // Fonction loop()
{
vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
digitalWrite(LED, HIGH);
vw_wait_tx(); // On attend la fin de l'envoi
msg[0]++;
delay(200); // Et on attend 200ms pour pas flooder
digitalWrite(LED, LOW);
}
Pour ton premier code de l'ATtiny : sur les lignes 14 et 15 il faut mettre INPUT_PULLUP. Pour le premier code de l'arduino : - Met en input le récepteur - Sur les lignes 25 et 29, tu ne peut pas comparer comme ça.
Renseigne toi sur les moyens de communication !
Le code type pour la comparaison (très moche, c'est pour te donner une idée, hein) Si pic reçu (interruption) char code[7] = {1,1,1,0,0,1,1}; int ok = 1; for (int i = 0; i < 7;i++) // Test de l'entête du message { if(digitalRead(com) == code[i]) { ok = 1; } else { ok = 0; break; }
} si ok = 1 ---> test du corps du message
Sinon ton idée de regarder ce qui est reçu est bonne ---> fait une boucle qui ne fait que ça et qui envoie tout sur le port série, pour voir.
Pour les interruptions, je peut vraiment pas t'aider. Mais essaye un code qui ne fait que lire l'entrée et envoie un message, pour voir où est le problème.
Aparement sur la broche réception de mon arduino j'ai ma broche qui affiche 0 et 1. Quand j'affiche le moniteur je vois des 0 et des 1 qui defille a toute vitesse.
Tu comprends ce que tu copies/colles ? Tu recois des infos dans un buffer 'buf', qui est un tableau. Il suffit surement de comparer ce buffer à une chaine de référence pour savoir si tu as appuyé sur le BP 1 ou 2
L'erreur c'est que tu vas tester un element de ton buffer (donc un caractère de la chaine) avec TOUT les éléments du tableau, alors que ce que tu aimerais faire (je pense) c'est tester si ton buffer est égale à ton tableau de référence, par exemple :
char ok1 = 1; //un flag pour dire que tout est OK
char ok2 = 1; //un flag pour dire que tout est OK
for(int i=0; i<10; i++)
{
//si jamais on a une case de différence
if(code1[i] != buf[i])
ok1 = 0; //on le signal avec un flage à 0
//idem pour le code 2
if(code2[i] != buf[i])
ok2 = 0;
}
if(ok1) //si le code 1 est entierment bon
Serial.print("code 1 OK");
if(ok2) //si le code 2 est entierment bon
Serial.print("code 2 OK");
Il y a moyen d'optimiser mais dans l'idée c'est ca
L'erreur c'est que tu vas tester un element de ton buffer (donc un caractère de la chaine) avec TOUT les éléments du tableau, alors que ce que tu aimerais faire (je pense) c'est tester si ton buffer est égale à ton tableau de référence, par exemple :
char ok1 = 1; //un flag pour dire que tout est OK
char ok2 = 1; //un flag pour dire que tout est OK
for(int i=0; i<10; i++)
{
//si jamais on a une case de différence
if(code1[i] != buf[i])
ok1 = 0; //on le signal avec un flage à 0
//idem pour le code 2
if(code2[i] != buf[i])
ok2 = 0;
}
if(ok1) //si le code 1 est entierment bon
Serial.print("code 1 OK");
if(ok2) //si le code 2 est entierment bon
Serial.print("code 2 OK");
Il y a moyen d'optimiser mais dans l'idée c'est ca
Ce que je voudrai faire c'est que enfete chaque BP a son code a lui. si j'appuie sur le premier sa fait telle action et si j'appuie sur le deuxième sa en fait une autre. Or ici, le code que tu m'a envoyé permet juste de voir si le message reçu a le même nombre de case que le message voulu.
Si mes 2 BP on le même nombre de case mais pas les même valeur sa va m'activer les 2 actions en même temps. (corrige moi si je me trompe).
Ce que je voudrai faire c'est que enfete chaque BP a son code a lui. si j'appuie sur le premier sa fait telle action et si j'appuie sur le deuxième sa en fait une autre. Or ici, le code que tu m'a envoyé permet juste de voir si le message reçu a le même nombre de case que le message voulu.
Si mes 2 BP on le même nombre de case mais pas les même valeur sa va m'activer les 2 actions en même temps. (corrige moi si je me trompe).
Non ce que je t'ai envoyé permet de comparer les cases une à une entre ce qui est recu et chaque code de référence... Si une case est fausse dans un des deux, alors le résultat pour ce code sera "faux"...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !