Go Down

Topic: Projet: Station meteo (Read 14 times) previous topic - next topic

barbudor

Bonjour
Quelle est la différence entre un TX20 et un TX23 ?
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

infobarquee


Bonjour
Quelle est la différence entre un TX20 et un TX23 ?


les coupelles de l'anémo, et surtout les composants à l'intérieur.
il y a aussi une différence dans les temps d'acquisition, le header n'est pas le même aussi.

mais ce qui me #######fle depuis ce matin comme sur le tx20, c'est ce DTR.
sur le forum italien ou certains avaient trouvé la solution, on ne peut pas dire dire soient très locaces ni accueillants.
aucun code de fournit malgré des mails à celui qui proposait de l'aide. :(

barbudor

#47
Apr 14, 2012, 08:29 pm Last Edit: Apr 14, 2012, 08:34 pm by barbudor Reason: 1
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

infobarquee

je connais ces 2 liens
pour le 1er, malheureusement, je ne suis pas assez calè pour le transposer pour l'arduino.
pour le 2eme, c'est pour lire depuis la station les données en mémoire via l'arduino.
dans le même style tu as ce lien http://www.open-electronics.org/how-to-connect-a-weather-station-ws2355-or-ws2300-to-weather-underground-with-arduino/

pour le pluvio, j'ai pas encore regardé, car mon but, plus qu'une station météo est de faire des relevés pour installer des éoliennes en loggant les rafales et vitesse moyenne du vent ainsi que l'orientation sur une carte SD ou en envoyant les données via un router wifi sur un server.

barbudor

Tu as vu aussi celui que je viens de rajouter sur le forum Arduino anglais ?
http://arduino.cc/forum/index.php?topic=62753.0
Il y a le code pour interpréter le train de bit
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

infobarquee

oui,
je me suis inspiré fortement du dernier code d'ailleurs.
mais toujours pas de vitesse à l'anémo.

infobarquee

alors bonne nouvelle, je pense avoir trouvé :)
mais pour ca, il faut que je puisse convertir le binaire de décimale :(

voici ce que j'ai rajouté pour récupérer une valeur pour la vitesse (un conseil, fumez pas en même temps MDR)
Code: [Select]

void loop() {
  collectdata();
    delay(2000);
   //pinMode(DTR, INPUT);
     digitalWrite(DTR,LOW);
digitalWrite(DTR,HIGH);
  digitalWrite(DTR,LOW);
    // pinMode(DTR, OUTPUT);

}

et pour inverser les données, j'ai fait ceci
Code: [Select]

//WIND SPEED
    String Wind_vit_PatternStr = "b";
  String Wind_vit_DescStr = "";
  //for (int i =9 ; i< 18 ; i++){
      for (int i =17 ; i>8 ; i--){
    Serial.print( ((data[i] == 41)? 0 : 1) );

  Wind_vit_PatternStr += ((data[i] == 41)? 0 : 1);

  }
  Serial.print(Wind_vit_PatternStr);
  Serial.print(" = "); 

ce qui donne maintenant
Code: [Select]

11011 0000 000000000b000000000 =  000 0000 1111 111111111 1110

b0000 = N



11011 0000 000000011b000000011 =  000 1100 1111 001111111 1110

b1111 = NNO



11011 1111 000000110b000000110 =  000 1010 0000 100111111 1110



donc maintenant, il faut que je puisse transformer le binaire en décimale.

barbudor

Dans le topic anglais il était effectivement écrit qu'il fallait inverser l'endianness.

Convertir binaire en décimal ?
Si tu as tous les bits qui t'interressent il suffit de sommer :

Quote
for ( bit = 0 ; bit < BIT_COUNT ; ++bit )
  data_dec += val_bit[bit] * (1<<bit);
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

infobarquee

bon j'ai du me vautrer quelque part car, même avec 0 partout, ca me sort 2224
Code: [Select]

11011 0000 000000000 000000000-----  12  000000000000-----000000000000


Code: [Select]

Serial.print("-----");
 
  Wind_vit_DescStr = Wind_vit_DescStr+("000");
  int len= Wind_vit_DescStr.length();
  Serial.print("  ");
  Serial.print(len);
    Serial.print("  ");
 
  Serial.print(Wind_vit_DescStr);
    Serial.print("-----");
  for(int ii=0;ii<=len;ii++)
  {
vitesse += Wind_vit_DescStr[ii] * (1<<ii);
Serial.print(Wind_vit_DescStr[ii]);
//Serial.print("\n");
  }
/// Serial.print(Wind_vit_PatternStr);
  Serial.print(" = "); 
Serial.print(vitesse);
  Serial.print(" ");

barbudor

Evidemment si Wind_vit_DescStr[] c'est des caractères
Je résonne en bit : valeur 0 ou 1

Quote
for(int ii=0;ii<=len;ii++)
  {
    if ( Wind_vit_DescStr[ii] == '1' )
       vitesse +=  (1<<ii);
  }


Mais peut être qu'il ne faut pas prendre à partir du 1er catactère.
Ce que je t'ai donné c'est le mécanisme de base pour convertir une suite de bit en entier.
Il faut l'appliquer correctement au protocole en question et tenir compte de l'ordre des bits (poids faibles/poids forts)
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

barbudor

J'ai regardé le code qu'il y a dans le forum anglais.
En supposant que tu as utilisé la même routine de récupération "collect3()" je vois que pour afficher la vitesse en binaire il fait :

Code: [Select]
//WIND SPEED
  for (int i =17 ; i> 8 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }


Donc les bits format la valeur de la vitesse sont stockées de [9] (poids faible puisqu'il l'affiche en dernier) à [17] (poids fort affiché en premier).
Donc pour créer un nombre décimal à partir des bits [8] à [17] je te propose :

Code: [Select]
int bit;
uint bit_val = 1;
int vitesse = 0;
for( bit = 9 ; bit <= 17 ; ++bit, bit_val <<= 1 )
  if ( data[bit] == '1' )
    vitesse += bit_val;


Le bit de poids faible [9] a pour poids 1, le suivant à pour poids 2 etc....
On lit donc la chaine du bit de poids faible au bit de poids fort en commençant par bit_val valan 1.
A chque bit, bit_val est multiplié par 2 puisque dans un nombre écrit en binaire :
bn ... b2 b1 b0
vaut
Somme ( bi * (2^i) )

Si on reprend l'exemple donné ici : http://www.rd-1000.com/chpm78/lacrosse/Lacrosse_TX23_protocol.html
Avec :


Si tu compte les bits du message de 0 en partant de la gauche, la vitesse est bien du bit 9 au bit 17, sans compter les 3 bits suivants qui sont d'après lui toujours à 0.

Ensuite il dit :
Quote
Wind Speed decoding:
The wind speed is sent under 9 bits (actually 12 but the last 3 are always 0), LSB first. The LSB value is 0,1m/s or 0,36km/h


Donc le code que je te donne ci-dessus permet de récupérer la vitesse en unités de 0,1m/s.
Par exemple :
110010000
Les bits à 1 sont b0, b1 et b4
Soit vitesse = 1 + 2 + 16 = 19 = 1,9 m/s

Est-ce plus clair maintenant ?

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

infobarquee

bon, j'ai eu vraiment du mal a tout comprendre sauf le principe, mais au péril de 3 boites d'efferalgan et 5 paquets de clopes :)
j'ai fait ma tambouille, qui est dégueulasse, mais bon, si je me suis pas vautré et en comparant avec ma station pro, ca le fait.
l'avantage est que la vitesse du vent est en instantanée.

voici le code complet pour ceux que ca pourrait intéresser ;) y a encore du nettoyage a faire mais bon
Code: [Select]

void delay2(unsigned long ms);
int collectdata(void);
void showdatasimple();
int dataPin = 2;
int bitlenght = -1;
char data[41];
String Wind_Direction;
int DTR=8;


void setup() {
  Serial.begin(9600);
  Serial.print("\n\nInitializing...\n");
  Serial.print("Data Pin: ");
  Serial.println(digitalRead(dataPin));
  pinMode(dataPin, INPUT);
  pinMode(DTR, OUTPUT);


}

void delay2(unsigned long ms){
  unsigned long start = micros();
  while (micros() - start <= ms);
}

void loop() {
  collectdata();
  delay(2000);
  //pinMode(DTR, INPUT);
  digitalWrite(DTR,LOW);
  digitalWrite(DTR,HIGH);
  digitalWrite(DTR,LOW);
  // pinMode(DTR, OUTPUT);

}


int collectdata(void){
  if (bitlenght <0){
    bitlenght = 1230;//getbitlenght2() 1230;
  }

  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(DTR, LOW);
  delay(100);

  digitalWrite(dataPin, LOW );
  digitalWrite(DTR, LOW );
  delay(500);

  pinMode(dataPin, INPUT);

  while(digitalRead(dataPin) == LOW){

  } 
  while(digitalRead(dataPin) == HIGH){

  }
  while(digitalRead(dataPin) == LOW){

  }

  for (int i=0 ; i<42 ; i++){

    data[i] = (digitalRead(dataPin) == LOW)? 41 : 42 ;
    delay2(bitlenght);
  }

  showdatasimple();
  return 0;
}

void showdatasimple(){
  Serial.println("");
  int bit;
  int bit_val = 1;


  String Wind_Dir_PatternStr = "b";
  String Wind_Dir_DescStr = "";

  for (int i =8 ; i> 4 ; i--){
    Wind_Dir_PatternStr += ((data[i] == 41)? 0 : 1);
  }

  Serial.print(Wind_Dir_PatternStr);
  Serial.print(" = ");

  if (Wind_Dir_PatternStr == "b0000") {
    Serial.print("N");
  }
  if (Wind_Dir_PatternStr == "b0001") {
    Serial.print("NNE");
  }
  if (Wind_Dir_PatternStr == "b0010") {
    Serial.print("NE");
  }
  if (Wind_Dir_PatternStr == "b0011") {
    Serial.print("ENE");
  }
  if (Wind_Dir_PatternStr == "b0100") {
    Serial.print("E");
  }
  if (Wind_Dir_PatternStr == "b0101") {
    Serial.print("ESE");
  }
  if (Wind_Dir_PatternStr == "b0110") {
    Serial.print("SE");
  }
  if (Wind_Dir_PatternStr == "b0111") {
    Serial.print("SSE");
  }
  if (Wind_Dir_PatternStr == "b1000") {
    Serial.print("S");
  }
  if (Wind_Dir_PatternStr == "b1001") {
    Serial.print("SSO");
  }
  if (Wind_Dir_PatternStr == "b1010") {
    Serial.print("SO");
  }
  if (Wind_Dir_PatternStr == "b1011") {
    Serial.print("OSO");
  }
  if (Wind_Dir_PatternStr == "b1100") {
    Serial.print("O");
  }
  if (Wind_Dir_PatternStr == "b1101") {
    Serial.print("ONO");
  }
  if (Wind_Dir_PatternStr == "b1110") {
    Serial.print("NO");
  }
  if (Wind_Dir_PatternStr == "b1111") {
    Serial.print("NNO");
  }

  Serial.println(Wind_Dir_DescStr);


  Serial.println("");

  //HEAD
  for (int i =0 ; i< 5 ; i++){
    Serial.print( ((data[i] == 41)? 0 : 1) );
  }

  Serial.print(" ");

  //WINDDIR
  for (int i =5 ; i< 9 ; i++){
    Serial.print( ((data[i] == 41)? 0 : 1) );
  }



  //Serial.print("///// ");

  //WIND SPEED
  //String Wind_vit_PatternStr = "b";
  String Wind_vit_DescStr = "";
  //int vitesse;
  //for (int i =9 ; i< 18 ; i++){
  for (int i =17 ; i>8 ; i--){
    //Serial.print( ((data[i] == 41)? 0 : 1) );
    Wind_vit_DescStr += ((data[i] == 41)? 0 : 1);
  }
  Serial.print("-----");

  Wind_vit_DescStr = Wind_vit_DescStr+("000");
  int len= Wind_vit_DescStr.length();
  Serial.print("  ");
  //Serial.print(len);
  //Serial.println("+++++");

  Serial.print(Wind_vit_DescStr);
  Serial.println("vitesse");
  String vit;
  int compt=1;
  int vitesse=0;
  for(int ii=9;ii<18;ii++)
  {

    vit = ((data[ii] == 41)? 0 : 1);
    if( vit =='1'){
      //Serial.println(ii);
      vitesse +=compt*2;
    }
    else{
      //Serial.println("prout");
    }
    //Serial.print(Wind_vit_DescStr[ii]);
    //Serial.print("->");Serial.print(vitesse);Serial.print(compt);
    //Serial.print("\n");
    compt++;
  }
  Serial.print("Vitesse vent");
  /// Serial.print(Wind_vit_PatternStr);
  Serial.print(" = "); 
  Serial.print(vitesse/10);
  Serial.print("m/s----");
  Serial.print((vitesse/10)*3.6);
  Serial.println("km/h----");
  Serial.print(" ");

  //WIND SPEED+3
  // for (int i =18 ; i< 21 ; i++){
  //    //Serial.print( ((data[i] == 41)? 0 : 1) );
  //} 

  // Serial.print(" ");

  //CC
  for (int i =21 ; i< 25 ; i++){
    // Serial.print( ((data[i] == 41)? 0 : 1) );
  }

  Serial.print(" ");

  //WIND DIR  NEGATEIVE
  for (int i =25 ; i< 29 ; i++){
    //Serial.print( ((data[i] == 41)? 0 : 1) );
  }

  Serial.print(" ");

  //WIND SPEED NEGATIVE
  for (int i =29 ; i< 38 ; i++){
    // for (int i =37 ; i> 28 ; i--){
    Serial.print( ((data[i] == 41)? 0 : 1) );
  }

  Serial.print(" ");

  //WIND SPEED NEGATIVE+3
  for (int i =38 ; i< 42 ; i++){
    Serial.print( ((data[i] == 41)? 0 : 1) );
  }
}


et le résultat
Code: [Select]

11011 1111-----  000001011000vitesse

Vitesse vent = 1m/s----3.60km/h----

   001011111 1110

b1010 = SO



11011 0101-----  000001011000vitesse

Vitesse vent = 1m/s----3.60km/h----

   001011111 1110

b0000 = N



11011 0000-----  000001011000vitesse

Vitesse vent = 1m/s----3.60km/h----

   001011111 1110



merci pour le gros coup de main, donc normal que je  partage le code  :smiley-mr-green:

barbudor

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

infobarquee

juste une petite rectif a faire
c'est pas int vitesse=0;
mais   float vitesse=0;
je teste pour voir la différence avec ma station pro, car j'ai un leger doute sur le binaire pris pour la conversion.

koukou

mon sujet est développement d' une station météo ,quels sont les différents capteurs météo q'on peut utiliser  en  programmant sous arduino Mega ADK 2560 ?

Go Up