[Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Les cartes Arduino, les platines

[Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude kelav » Jeu 7 Mar 2013 22:23

Présentation
Nous allons créer un système pour envoyer un chiffre par les ondes radios entre deux attiny85.

Pour cela nous allons envoyer depuis un premier attiny85 (le transmetteur) le message "1234" en appuyant sur un bouton.
Lorsque le deuxième attiny85 (le récepteur) recevra ce message ,il allumera une LED.

Voilà un schéma explicatif
Image

Matériel


Programmation des attiny85
Avant tout chose, vous devez apprendre à programmer un attiny85
Voici mon tutoriel expliquant comment programmer un attiny85 avec un arduino
http://forum.snootlab.com/viewtopic.php?f=38&t=772&p=3693

Schéma de montage
Image

Pour vérifier si le transmetteur envoie bien des données quand vous appuyez sur le bouton, vous pouvez mettre une led (avec une résistance) entre la broche 0 (data) de l'attiny85 et la terre (Gnd).


Pour alimenter les attiny85 en 5V, vous pouvez utiliser l'arduino ou une pile ou un câble usb

Ajouter la bibliothèque : MANCHESTER
Pour communiquer entre les deux attiny85, nous allons utiliser la bibliothèque MANCHESTER
Vous pouvez consulter la documentation ici
Et le télécharger ici

Il vous suffit d'extraire l'archive dans arduino-1.0.1/libraries
Puis de le renommer Manchester.

Programmation du Récepteur
Code: Tout sélectionner
//Test de Récepteur Radio 433.92Mhz Attiny85
//Par Sarrailh Rémi
//Domaine Publique

//   Attiny85 (5v)
//   -------
//   |0   -|
//   |1   3|
//   |2   4|
//   |+   o|
//   -------

//Ajout de la bibliothèque Manchester
#include <MANCHESTER.h>

//Définition des broches pour chaque composants
int dataPin = 0; //Data du Récepteur
int ledPin = 1;  //+ de la LED

void setup()
{
   //Mettre la led sur la broche 0
  pinMode(ledPin, OUTPUT); 
   
  //Allume la led 1 secondes au démarrage
  digitalWrite(ledPin, HIGH);   
  delay(1000);   
 
  //Eteins la led 
  digitalWrite(ledPin, LOW);
   
  // Mettre le récepteur sur la broche 1
  MANRX_SetRxPin(dataPin);
  // Préparation de la réception des données
  MANRX_SetupReceive();
  // Lancement de la réception des données
  MANRX_BeginReceive();
 
}

void loop()
{
 
 //Si les données sont lisibles
if (MANRX_ReceiveComplete())
{
  //Récupère le message (en int)
  unsigned int data = MANRX_GetMessage();
  MANRX_BeginReceive();
 
  //Si le message est égale à 1234
  if (data == 1234)
  {
      //Active la led pendant 1 secondes
     digitalWrite(ledPin, HIGH);   
     delay(1000);   
     //Eteins la led 
     digitalWrite(ledPin, LOW);
  }
}
}


Programmation de l’Émetteur
Code: Tout sélectionner
#include <MANCHESTER.h>

//Définition des broches pour chaque composants
int txPin = 0; //Transmetteur radio
int button = 1; // Bouton Tactile

void setup()

//Active l'envoi des données sur la broche txPin (
  MANCHESTER.SetTxPin(txPin);
 
//Activation du bouton
  pinMode(button, INPUT); 
  digitalWrite(button, HIGH);
}

void loop()
{
//Si le bouton est appuyé
 if (digitalRead(button) == LOW)
 {
   //Envoyer 1234
   unsigned int data = 1234;
   MANCHESTER.Transmit(data);
  //Le bouton est remis sur HIGH
   digitalWrite(button, HIGH);
 } 

}
Dernière édition par kelav le Sam 9 Mar 2013 13:47, édité 1 fois.
Pour plus d'infos ! une seul adresse
http://smarturl.it/remi
kelav
 
Messages: 51
Inscription: Jeu 29 Nov 2012 19:00
Localisation: Montpellier

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude phil » Ven 8 Mar 2013 11:10

Super ;) ;) ;)

voila un truc que je voulais expérimenter depuis quelque temps...
J'avais vu la lib manchester mais je ne suis pas passé à la phase expérimentation.
Bravo pour le boulot et l'effort de documentation :)
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude djeremaille » Mar 9 Avr 2013 15:43

Bonjour,

Je suis nouveau sur le forum et en électronique également.
Ce tutoriel explique exactement ce que je veux faire mais je n'y arrive pas.

Mon installation: Arduino 1.0.4, un programmateur Usbtinyisp et des ATTiny85v.
J'ai copié les fichiers de définition Attiny dans Arduino/harware, copié Manchester dans Arduino/libraries.
Je sélectionne Attiny85 avec 8Mhz internal oscillator et UsbtinyISP
Je précise que le programme Blink fonctionne parfaitement bien.

Ensuite je copie/colle ton code et je lance la vérification mais impossible, plein d'erreurs que voici:

Code: Tout sélectionner
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp: In function 'void MANRX_SetupReceive()':
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:196: error: 'TCCR2A' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:196: error: 'WGM21' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:197: error: 'TCCR2B' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:197: error: 'CS22' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:197: error: 'CS21' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:198: error: 'OCR2A' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:199: error: 'TIMSK2' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:199: error: 'OCIE2A' was not declared in this scope
C:\Documents and Settings\jhk\My Documents\Arduino\libraries\Manchester\MANCHESTER.cpp:200: error: 'TCNT2' was not declared in this scope


Sous linux j'avais les mêmes erreurs et là je teste sous xp mais pareil.

Ca fait un moment que je m'arrache les cheveux, de l'aide serait plus que bienvenue.
djeremaille
 
Messages: 3
Inscription: Mar 9 Avr 2013 15:31

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude kelav » Mar 9 Avr 2013 19:04

Salut djeremaille!

La seul manière dont j'ai réussi à reproduire le problème que tu as c'est en sélectionnant
Attiny84 à la place de l'Attiny85.
Soit tu t'es trompé dans les choix, soit il y a un soucis au niveau des fichiers de définitions.

Pour aller plus dans les détails:
Les erreurs sont dût au faite qu'au début de la bibliothèque (library) manchester.cpp, des valeurs sont définis selon le micro-contrôleur (plus exactement il effectue des modifications dans les registres du micro-contrôleur afin d'avoir accès plus en profondeur à son fonctionnement)

Code: Tout sélectionner
#if defined( __AVR_ATtinyX5__ ) //Si c'est un attiny85
#elif defined(__AVR_ATmega32U4__) // Si c'est un Atmega
#else //Sinon


Normalement lorsque l'attiny85 est sélectionné il devrait faire ça:
Code: Tout sélectionner
TCCR1 = _BV(CTC1) | _BV(CS12); //counts every usec with an 8Mhz clock
OCR1A = 0; // interrupt every usec
TIMSK = _BV(OCIE1A); // Turn on interrupt
TCNT1 = 0; // Set counter to 0


Tu remarqueras qu'il n'est pas question des variables qui cause des erreurs.

Là clairement au lieu d'aller dans #if defined( __AVR_ATtinyX5__ ), il va dans le else (ce qui veut dire qu'il ne fait pas partie de la liste des micro contrôleur qu'il connait)

Code: Tout sélectionner
TCCR2A = _BV(WGM21); // reset counter on match
TCCR2B = _BV(CS22) | _BV(CS21); //counts every 16 usec with 16 Mhz clock
OCR2A = 5; // interrupt every 5 counts (0->3)
TIMSK2 = _BV(OCIE2A); // Turn on interrupt
TCNT2 = 0; // Set counter to 0


On retrouve les valeurs qui provoquent les erreurs.

Voilà, maintenant je tiens à préciser que je suis loin d'être un spécialiste , du coup je dis peut être des bêtises ^^.
D'ailleurs si tu as envie de te casser le cerveau un bon coup la documentation de l'attiny85 est disponible ici:
http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf
Mais je t'avoue que c'est pas très passionnant comme lecture (quoique...)

Bon courage en tout cas!

EDIT: Je pense pas que ce soit une bonne idée mais j'ai modifié le code de manchester.cpp pour fonctionner uniquement sur l'attiny85, ça peut être un truc à tester
https://gist.github.com/maditnerd/5347985/raw/357bb3b7be1cb294cc92baab9f89171b13b518d1/manchester.cpp
Pour plus d'infos ! une seul adresse
http://smarturl.it/remi
kelav
 
Messages: 51
Inscription: Jeu 29 Nov 2012 19:00
Localisation: Montpellier

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude djeremaille » Mar 9 Avr 2013 19:43

Merci beaucoup pour l'attention que tu portes à mon problème.

J'ai vérifié mais j'ai bien sélectionné Attiny85 8Mhz internal, UsbTiny, j'ai changé d'attiny pour voir.

Avec le nouveau cpp que tu as fait: pareil....

J'ai aussi essayé en flashant à 1Mhz et plein d'autres trucs mais rien....
djeremaille
 
Messages: 3
Inscription: Mar 9 Avr 2013 15:31

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude djeremaille » Mer 10 Avr 2013 17:46

Salut!

Ca y est j'ai réussi à compiler les programmes grâce a ton CPP modifié!!
J'avais renommé l'autre MANCHESTERold et pour une raison que j'ignore, c'est celui-ci qui était utilisé pour la compilation. Il a fallu que je l'enlève du dossier pour qu'il prenne en compte le nouveau... bizarre.

Merci encore je vais pouvoir attaquer mon projet. Je voudrais contrôler deux relais distants à l'aide de deux boutons poussoirs. Je ne sais pas si c'est faisable et si le programme tiendra sur l'attiny.

De plus pour le moment ton programme ne fait pas ce qu'il est censé faire. La led s'allume bien au démarrage pendant 1 sec mais rien ne se passe quand j'appuie sur le BP....
Je ne sais pas si ça joue mais n'ayant pas de module rf pour le moment les pins 0 sont reliées par un fil.
djeremaille
 
Messages: 3
Inscription: Mar 9 Avr 2013 15:31

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude pavan » Dim 21 Avr 2013 10:33

Bonjour : merci pour ces tuyaux , l'attiny85 commençait à m'agacer !!
raspberry, arduino uno
pavan
 
Messages: 6
Inscription: Dim 24 Mar 2013 11:23

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude Amaprose » Mer 24 Avr 2013 14:18

Bonjour,
J'espère ne pas être trop hors sujet par rapport à votre tutoriel.
Si c'est le cas, je m'en excuse. Je n'ai pas vu comment ouvrir un nouveau sujet !!!
Puis c'est le seul forum et sujet que j'ai trouvé sur internet qui se rapproche le plus de mon projet et je sent, peut-être à tort, que vous avez les compétences pour répondre à mon questionnement.
Je n'ai aucune connaissance en électrotechnique mais je suis régisseur lumière dans le spectacle vivant et pour la mise en scène de notre prochain spectacle Théâtre/Chorale j'ai acheté 40 "Led Single Color Dimmer".
Voici un lien youtube pour que vous puissiez voir ce que c'est: http://www.youtube.com/watch?v=gmOl0lNr48M
Pour mes besoins, je l'alimente avec une toute petite pile 12V puis à la sortie je branche un petit panneau de 54 Led. Tout ceci est dissimulé dans les costumes des Choristes. Ainsi chacun peut avec sa propre télécommande gérer l'allumage en fonction des tops lumière, l'extinction et le niveau de puissance du panneau Led.
C'est parfait, tout fonctionne bien...

Mais maintenant, j'aimerais savoir s'il est possible que, moi en régie, j'ai aussi une télécommande qui puisse gérer les 40 boitiers en même temps, pas un par un mais bien le On/OFF et le niveau et surtout sans rien changer au fonctionnement entre un boitier et sa propre télécommande ?
Si c'est possible, pouvons nous faire cette télécommande à partir d'une qui existe déjà, auquel cas je peux sacrifier un boitier sans problème ou faut-il créer de toutes pièces une nouvelle télécommande ?

Si l'un ou l'une d'entre vous se sent inspiré par ce challenge merci de me répondre car les premières représentations commencerons en octobre 2013. Au besoin, j'ai pris des photos des circuits imprimés de la télécommande (émetteur), du boitier dimmer (récepteur) ainsi que du panneau de Led. De plus, puisque nous avons un petit budget (Troupe amateurs) pour monter le spectacle et étant tout à fait incapable de le faire moi même, je propose une petite compensation financière pour celle ou celui qui fera ce travail.

Merci par avance de vos réponses.

Gérald
Amaprose
 
Messages: 12
Inscription: Mer 24 Avr 2013 13:20

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude kelav » Jeu 25 Avr 2013 17:37

J'ai reposté ton message sur la rubrique projets où il aura plus de visibilité
http://forum.snootlab.com/viewtopic.php?f=32&t=948
Pour plus d'infos ! une seul adresse
http://smarturl.it/remi
kelav
 
Messages: 51
Inscription: Jeu 29 Nov 2012 19:00
Localisation: Montpellier

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude Amaprose » Jeu 25 Avr 2013 18:02

Merci Kelav d'avoir redirigé mon message.

J'espère avoir quelques réponses...
Amaprose
 
Messages: 12
Inscription: Mer 24 Avr 2013 13:20

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude pavan » Sam 27 Avr 2013 18:18

problème résolu : Merci beaucoup à l'auteur initial de ce post

j'envoie la température sous forme unsigned int : (deux octets)

Emetteur Attiny85
#include <OneWire.h> // Inclusion de la librairie OneWire
#include <MANCHESTER.h>

#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 3 // Broche utilisée pour le bus 1-Wire
char msg[10];
unsigned int temper;
unsigned int capt=4096;//capteur 1 , c'est son numéro soit 0001 0000 0000 0000 en binaire !!!
int txPin = 4; //Transmetteur radio
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20

ds.write(0x44, 1); // On lance une prise de mesure de température
delay(1000); // Et on attend la fin de la mesure

ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20
ds.write(0xBE,1); // On envoie une demande de lecture du scratchpad

for ( int i = 0; i < 2; i++) {// On lit le scratchpad
data[i] = ds.read(); // Et on stocke les octets reçus
}
temper = (256*data[1]+data[0]) ^capt ;// conversion sur deux octets pour transmission

MANCHESTER.Transmit(temper);
delay(60000);
// Pas d'erreur
return true;
}
void setup() {
MANCHESTER.SetTxPin(txPin);
}

// loop()
void loop() {
float temp;
// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {

}
}

***************************************************************************************
// include the library code:
#include <LiquidCrystal.h>
#include <MANCHESTER.h>
#include <OneWire.h>
char msg[10];
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 9 // Broche utilisée pour le bus 1-Wire

unsigned int capt=4096;//capteur 1 , ce n'est pas une température possible !!!

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int dataPin = 0; //Data du Récepteur
unsigned int temper2 = 0;
unsigned int temper = 0;
float temper1 = 0;

float temper0 = 0;

int capt1;
int capt2;
char sge;
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20

ds.write(0x44, 1); // On lance une prise de mesure de température
delay(1000); // Et on attend la fin de la mesure

ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20
ds.write(0xBE,1); // On envoie une demande de lecture du scratchpad

for ( int i = 0; i < 2; i++) {// On lit le scratchpad
data[i] = ds.read(); // Et on stocke les octets reçus
}
temper2 = (256*data[1]+data[0]);// conversion sur deux octets pour transmission
if (temper2 < 16384)
{sge= '+' ;
}

else
{
sge = '-' ;

temper2 = ~temper2 +1 ;//complement à 2
}
temper0 = float(temper2);
temper0 = temper0 * 0.0625;

// Pas d'erreur
return true;
}

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.

// Mettre le récepteur sur la broche 1
MANRX_SetRxPin(dataPin);
// Préparation de la réception des données
MANRX_SetupReceive();
// Lancement de la réception des données
MANRX_BeginReceive();
}

void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
float temp;
// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {

}







//Si les données sont lisibles
if (MANRX_ReceiveComplete())
{
//Récupère le message (en int)
unsigned int data = MANRX_GetMessage();
MANRX_BeginReceive();
temper = data ;
//temperature positive

if (temper < 16384)
{sge= '+' ;
}

else
{
sge = '-' ;
temper = ~temper +1 ;//complement à 2
}
capt = temper & 4096;// capteur 1 ?
if (capt == 4096){
capt=1;
}
else
{
capt=2;
}


temper2 = temper & 2047;

temper1 = float (temper2) ;
temper1 = temper1 * 0.0625 ;
}
// print the number of seconds since reset:
lcd.setCursor(0, 0);
lcd.print("temp1 : ");


lcd.setCursor(11, 0);
lcd.print (temper0);
lcd.setCursor(8, 0);
lcd.print (sge);


lcd.setCursor(0, 1);

lcd.print("temp2 : ");
lcd.setCursor(8, 1);
lcd.print (sge);
lcd.setCursor(11, 1);
lcd.print (temper1);
}
// masque du capteur 1 4096 0001 0000 0000 0000 , du capteur2 8192 0010 0000 0000 0000

Remarque1 : j'ai traité

a) le cas des températures négatives (notées en complément à 2 par le DS18b20)
b) ajouter du programme d'afficheur led... (facile)
c) le codage / décodage des capteurs

Remarque 2 : la programmation de l'attiny85 nécessite un fichier Manchester.cpp différent de celui de l 'atmega328 , c'est un peu pénible à gérer mais ça fonctionne bien.

J'ai inclus les capteurs dans la mesure des températures en bidouillant les bits de signe des octets (codage dans emetteur , décodage dans récepteur).

Le montage a été testé (dans le congélateur) pour vérifier le bon fonctionnement des températures négatives.

Un capteur est branché sur la carte emetteur (temp2) , un second sur la carte réceptrice (temp1).
Dernière édition par pavan le Dim 28 Avr 2013 18:28, édité 2 fois.
raspberry, arduino uno
pavan
 
Messages: 6
Inscription: Dim 24 Mar 2013 11:23

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude kelav » Mar 14 Mai 2013 05:08

Cool le tuto, faudra que je me penche dessus ^^
Je me permets de le reposter avec une meilleur mise en page.

J'envoie la température sous forme unsigned int : (deux octets)

Emetteur Attiny85
Code: Tout sélectionner
#include <OneWire.h> // Inclusion de la librairie OneWire
#include <MANCHESTER.h>

#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 3 // Broche utilisée pour le bus 1-Wire
char msg[10];
unsigned int temper;
unsigned int capt=4096;//capteur 1 , c'est son numéro soit 0001 0000 0000 0000 en binaire !!!
int txPin = 4; //Transmetteur radio
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20

ds.write(0x44, 1); // On lance une prise de mesure de température
delay(1000); // Et on attend la fin de la mesure

ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20
ds.write(0xBE,1); // On envoie une demande de lecture du scratchpad

for ( int i = 0; i < 2; i++) {// On lit le scratchpad
data[i] = ds.read(); // Et on stocke les octets reçus
}
temper = (256*data[1]+data[0]) ^capt ;// conversion sur deux octets pour transmission

MANCHESTER.Transmit(temper);
delay(60000);
// Pas d'erreur
return true;
}
void setup() {
MANCHESTER.SetTxPin(txPin);
}

// loop()
void loop() {
float temp;
// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {

}
}


Récepteur Atmega328
Code: Tout sélectionner
// include the library code:
#include <LiquidCrystal.h>
#include <MANCHESTER.h>
#include <OneWire.h>
char msg[10];
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 9 // Broche utilisée pour le bus 1-Wire

unsigned int capt=4096;//capteur 1 , ce n'est pas une température possible !!!

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int dataPin = 0; //Data du Récepteur
unsigned int temper2 = 0;
unsigned int temper = 0;
float temper1 = 0;

float temper0 = 0;

int capt1;
int capt2;
char sge;
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20

ds.write(0x44, 1); // On lance une prise de mesure de température
delay(1000); // Et on attend la fin de la mesure

ds.reset(); // On reset le bus 1-Wire
ds.skip(); // On sélectionne le DS18B20
ds.write(0xBE,1); // On envoie une demande de lecture du scratchpad

for ( int i = 0; i < 2; i++) {// On lit le scratchpad
data[i] = ds.read(); // Et on stocke les octets reçus
}
temper2 = (256*data[1]+data[0]);// conversion sur deux octets pour transmission
if (temper2 < 16384)
{sge= '+' ;
}

else
{
sge = '-' ;

temper2 = ~temper2 +1 ;//complement à 2
}
temper0 = float(temper2);
temper0 = temper0 * 0.0625;

// Pas d'erreur
return true;
}

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.

// Mettre le récepteur sur la broche 1
MANRX_SetRxPin(dataPin);
// Préparation de la réception des données
MANRX_SetupReceive();
// Lancement de la réception des données
MANRX_BeginReceive();
}

void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
float temp;
// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {

}

//Si les données sont lisibles
if (MANRX_ReceiveComplete())
{
//Récupère le message (en int)
unsigned int data = MANRX_GetMessage();
MANRX_BeginReceive();
temper = data ;
//temperature positive

if (temper < 16384)
{sge= '+' ;
}

else
{
sge = '-' ;
temper = ~temper +1 ;//complement à 2
}
capt = temper & 4096;// capteur 1 ?
if (capt == 4096){
capt=1;
}
else
{
capt=2;
}


temper2 = temper & 2047;

temper1 = float (temper2) ;
temper1 = temper1 * 0.0625 ;
}
// print the number of seconds since reset:
lcd.setCursor(0, 0);
lcd.print("temp1 : ");


lcd.setCursor(11, 0);
lcd.print (temper0);
lcd.setCursor(8, 0);
lcd.print (sge);


lcd.setCursor(0, 1);

lcd.print("temp2 : ");
lcd.setCursor(8, 1);
lcd.print (sge);
lcd.setCursor(11, 1);
lcd.print (temper1);
}
// masque du capteur 1 4096 0001 0000 0000 0000 , du capteur2 8192 0010 0000 0000 0000


Remarque1 :
J'ai traité :
    a) le cas des températures négatives (notées en complément à 2 par le DS18b20)
    b) ajouter du programme d'afficheur led... (facile)
    c) le codage / décodage des capteurs

Remarque 2 :
  • La programmation de l'attiny85 nécessite un fichier Manchester.cpp différent de celui de l 'atmega328 , c'est un peu pénible à gérer mais ça fonctionne bien.
  • J'ai inclus les capteurs dans la mesure des températures en bidouillant les bits de signe des octets (codage dans émetteur , décodage dans récepteur).
  • Le montage a été testé (dans le congélateur) pour vérifier le bon fonctionnement des températures négatives.
  • Un capteur est branché sur la carte émetteur (temp2) , un second sur la carte réceptrice (temp1).
Pour plus d'infos ! une seul adresse
http://smarturl.it/remi
kelav
 
Messages: 51
Inscription: Jeu 29 Nov 2012 19:00
Localisation: Montpellier

Re: [Tutoriel] Communiquer en 433.92Mhz avec deux attiny85

Message non lude stalex » Jeu 7 Mai 2015 16:32

Bonjour,

j'ai une question toute bête à la lecture des schémas: qu'utilises-tu comme "alimentation" ?
Je chercherai à encapsuler un AtTiny qui emette dans une boite murale, je serai donc intéressé si tu avais une solution prenant peu de place pour alimenter le AtTiny.

Merci !
stalex
 
Messages: 4
Inscription: Sam 2 Mai 2015 22:36


Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité