Inlezen gegevens - "Woord"

Ook hier heb ik een oplossing voor gevonden.

Dit is mijn werkend script:

int dataPin = 31;
int bitlenght = -1;
String myWindRichting ;
String myWindsnelheid ;
char data[41];


     
  
void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
             }

void loop() {
  collectdata3();
  delay(1000);   
            }

int collectdata3(void) {
       if (bitlenght <0){
               bitlenght = 1220;//getbitlenght2();
                         }
  
        pinMode(dataPin, OUTPUT);

        digitalWrite(dataPin, HIGH);
        delay(100);
        digitalWrite(dataPin, LOW );
        delay(500);
        pinMode(dataPin, INPUT);


        while(digitalRead(dataPin) == LOW){
                                           }  
         //wait slave start signal
        while(digitalRead(dataPin) == HIGH){
                                            }
        while(digitalRead(dataPin) == LOW){
                                           }
  

        for (int i=0 ; i<42 ; i++){
                  data[i] = (digitalRead(dataPin) == LOW)? 48 : 49 ;
                  delayMicroseconds(bitlenght);    
                                  }

         showdatasimple();
         return 0;
         }


void showdatasimple(){

  Serial.println(" ");
  

  //WIND SPEED
          myWindsnelheid = "";
          for (int i =29 ; i< 38 ; i++){
            myWindsnelheid = myWindsnelheid + ((data[i] == 48)? 0 : 1);
            }


//WIND DIR  NEGATEIVE
          myWindRichting = "";
          for (int i =25 ; i< 29 ; i++){
            myWindRichting = myWindRichting + ((data[i] == 48)? 0 : 1);
            }
        
// Serial.print (myWindsnelheid);
  Serial.print("  Snelheid => ");  
  if ( myWindsnelheid == "111111111") Serial.println("     0,0 m/s");  
  if ( myWindsnelheid == "011111111") Serial.println("     0,1 m/s");
  if ( myWindsnelheid == "101111111") Serial.println("     0,2 m/s");
  if ( myWindsnelheid == "110111111") Serial.println("     0,4 m/s");
  if ( myWindsnelheid == "111011111") Serial.println("     0,8 m/s");
  if ( myWindsnelheid == "111101111") Serial.println("     1,6 m/s");
  if ( myWindsnelheid == "111110111") Serial.println("     3,2 m/s");
  if ( myWindsnelheid == "111111011") Serial.println("     6,4 m/s");
  if ( myWindsnelheid == "111111101") Serial.println("     12,8 m/s");
  if ( myWindsnelheid == "111111110") Serial.println("     25,6 m/s");
  if ( myWindsnelheid == "001111111") Serial.println("     0,3 m/s");
  if ( myWindsnelheid == "110011111") Serial.println("     1,2 m/s");
  if ( myWindsnelheid == "110000011") Serial.println("     12,4 m/s");
  if ( myWindsnelheid == "111110011") Serial.println("     9,6 m/s");
  if ( myWindsnelheid == "111111100") Serial.println("     38,4 m/s");
  if ( myWindsnelheid == "000000000") Serial.println("     51,1 m/s");


// Serial.print (myWindRichting);
  Serial.print("  Richting => "); 
  if ( myWindRichting == "1111") Serial.println("     N");       
  if ( myWindRichting == "1110") Serial.println("     NNO");     
  if ( myWindRichting == "1101") Serial.println("     NO");      
  if ( myWindRichting == "1100") Serial.println("     ONO");     
  if ( myWindRichting == "1011") Serial.println("     O");
  if ( myWindRichting == "1010") Serial.println("     OZO");
  if ( myWindRichting == "1001") Serial.println("     ZO");
  if ( myWindRichting == "0111") Serial.println("     Z");
  if ( myWindRichting == "1000") Serial.println("     WZW");
  if ( myWindRichting == "0110") Serial.println("     ZZW");
  if ( myWindRichting == "0101") Serial.println("     ZW");
  if ( myWindRichting == "0100") Serial.println("     ZW");
  if ( myWindRichting == "0011") Serial.println("     W");
  if ( myWindRichting == "0010") Serial.println("     WNW");
  if ( myWindRichting == "0001") Serial.println("     NW");
  if ( myWindRichting == "0000") Serial.println("     NNW");

}

MAAR ik vind het maar niks met al die “IF”-'s…
Ik weet dat het beter kan met iets anders? een select Case of een ander trucje.

In eerste instantie heb ik de data die ik binnen krijg omgezet in een String, dat leek me een betere manier om mijn probleem op te lossen, ik stak deze in een if lus.
Maar dit lijkt me niet zo programmeer logisch… De Binaire dat moet toch direct kunnen verwerkt worden?

Wie zet me op de goede weg?

Alvast bedankt

je krijgt blijkbaar een binair getal in string maar dan in omgekeerde volgorde.
als je dat weer in een getal omvormd ben jer er.
Ik zie wel 9 bytes wat ik heel raar vind. Is het geen 8 bytes en een checkbit? (indoien zo klopt de code zeker niet)

omzetten zou je als volgt kunnen doen (ik ben wel geen binair specialist en niet getest)

int snelheid= (((myWindsnelheid[0]=='1'<<1)+myWindsnelheid[1]=='1')<<1)+myWindsnelheid[2]=='1' ......

hoe dit werkt neem ik het voorbeeld “101”

myWindsnelheid[0]==‘1’ is dan ‘1’==‘1’ dat is dus juist = true = 1

(myWindsnelheid[0]==‘1’<<1) is dan 1<<1 of 1 bitshift naar links dat geeft dan 10 (binair = 2 decimaal)

((myWindsnelheid[0]==‘1’<<1)+myWindsnelheid[1]==‘1’) is dan binair ((10)+myWindsnelheid[1]==‘1’)
myWindsnelheid[1]==‘1’ is ‘0’==‘1’ is fout = false = 0
dat geeft dus ((10)+ 0) =10 (binair =2 decimaal)

(((myWindsnelheid[0]==‘1’<<1)+myWindsnelheid[1]==‘1’)<<1)+myWindsnelheid[2]==‘1’
is dan
(10<<1)+myWindsnelheid[2]==‘1’
(10<<1) = 100
myWindsnelheid[2]==‘1’ = '1==‘1’ = 1
dus
100+1 =101 (binair of 5 decimaal)
en zo voort.
Je ziet dat de getallen overen komen met wat je in je print statements zet.
Met vriendelijke groet
Jantje

In eerste geval, Jantje, ik bedank je voor je snelle reactie.

Als tweede punt, hoe eigenaardig ook, het zijn er NEGEN 9. Ik heb deze al regelmatig geteld.... En neen ik begrijp het ook niet waarom.

De TX23 is een windvaantje die gebruik wordt in verschillende weer instrumenten. La Cross TX23 om precies te zijn.

Voor de rest, ik ga nu je code even bekijken... I 'll keep in touch.

Bedankt Ivan

Dag Jantje, ik ben er terug.
De opzet lijkt goed.

Echter wanneer ik de bitshift left (<<), bitshift right (>>) erbij neem dan zie ik dat hij met deze commando’s een verschuiving uitvoert en geen merge.

Of zit ik totaal naast de kwestie?

Ik snap niet zo goed wat je bedoeld.
De <<1 doet een verschuiving van 1 bit en de + telt er dan de volgende bit (in de laagtste positie) bij op.
Wat zie jij dat je doet denken dat het niet goed is?
Met vriendelijke groet
Jantje

[grapje]Ik weet het soms weet ik zelf niet wat ik bedoel, en moet ik het mezelf opnieuw vragen .... :roll_eyes: [/grapje]

De eerste bit wordt ingelezen. woord = "eerste bit" De tweede bit wordt erachter gezet. woord = "eerste bit + tweede bit" De derde bit wordt ingelezen woord = "eerste bit + tweede bit + derde Bit" Enzovoort ...

Is dit wat je bedoelt?

MVG Ivan

Als je bedoeld met “erachter gezet”
( X <<1)+Y waar Y = 0 of 1
ja

jantje

Of zoals ze in Vlaanderen zeggen "aja"

ik heb terug iets om over na te denken, laten rijpen zeg maar ....

I'll Keep U informed

Bedankt Ivan

Uit het programma heb ik dit gewijzigd:

  //WIND SPEED
          myWindsnelheid = "";
          for (int i =29 ; i< 38 ; i++){
            myWindsnelheid = myWindsnelheid + ((data[i] == 48)? 0 : 1);
            snelheid = ((((((myWindsnelheid[0]=='1'<<1)+myWindsnelheid[2]=='1')<<1))+myWindsnelheid[3]=='1')<<1);
            }

Dit geeft mijn Serial Monitor weer

Snelheid 01001

De windvaan staat gemonteerd binnenskamers (snelheid = 0 aangeduid met binaire code 1111111)
Dus het komt niet zo direct overeen…

Ik neem, voor de testfase enkel drie inkomende bits.

probeer dit eens

myWindsnelheid = "";
snelheid=0;
          for (int i =29 ; i< 38 ; i++){
            int curval=(data[i] == 48)? 0 : 1;

            myWindsnelheid = myWindsnelheid + curval;
            snelheid = (snelheid<<1)+curval;
            Serial.print("curval: ");
            Serial.println(curval );
            Serial.print("Windsnelheid: ");
            Serial.println(myWindsnelheid );
            Serial.print("snelheid : ");
            Serial.println(snelheid  );
            }

en dump dan eens wat er uit de seriele monitor komt.

Hoi Jantje,
Een beetje laat excuus.

Het resultaat:

curval: 1
Windsnelheid: 1
snelheid : 1
curval: 0
Windsnelheid: 10
snelheid : 2
curval: 1
Windsnelheid: 101
snelheid : 5
curval: 1
Windsnelheid: 1011
snelheid : 11
curval: 1
Windsnelheid: 10111
snelheid : 23
curval: 1
Windsnelheid: 101111
snelheid : 47
curval: 1
Windsnelheid: 1011111
snelheid : 95
curval: 1
Windsnelheid: 10111111
snelheid : 191
curval: 1
Windsnelheid: 101111111
snelheid : 383

En dit is de volledige sketch.
Denk eraan, alles moet nog op een LCD schermpje komen…
En geïntegreerd worden in de Klok samen met atmosferische eenheden.

int dataPin = 31;
int bitlenght = -1;
String myWindRichting ;
String myWindsnelheid ;
char data[41];
int snelheid;

     
  
void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
             }

void loop() {
  collectdata3();
  delay(1000);   
            }

int collectdata3(void) {
       if (bitlenght <0){
               bitlenght = 1220;//getbitlenght2();
                         }
  
        pinMode(dataPin, OUTPUT);

        digitalWrite(dataPin, HIGH);
        delay(100);
        digitalWrite(dataPin, LOW );
        delay(500);
        pinMode(dataPin, INPUT);


        while(digitalRead(dataPin) == LOW){
                                           }  
         //wait slave start signal
        while(digitalRead(dataPin) == HIGH){
                                            }
        while(digitalRead(dataPin) == LOW){
                                           }
  

        for (int i=0 ; i<42 ; i++){
                  data[i] = (digitalRead(dataPin) == LOW)? 48 : 49 ;
                  delayMicroseconds(bitlenght);    
                                  }

         showdatasimple();
         return 0;
         }


void showdatasimple(){

  Serial.println(" ");
  

  //WIND SPEED
          myWindsnelheid = "";
          for (int i =29 ; i< 38 ; i++){
            myWindsnelheid = myWindsnelheid + ((data[i] == 48)? 0 : 1);
            }


//WIND DIR  NEGATEIVE
          myWindRichting = "";
          for (int i =25 ; i< 29 ; i++){
            myWindRichting = myWindRichting + ((data[i] == 48)? 0 : 1);
            }
            
                     
myWindsnelheid = "";
snelheid=0;
          for (int i =29 ; i< 38 ; i++){
            int curval=(data[i] == 48)? 0 : 1;

            myWindsnelheid = myWindsnelheid + curval;
            snelheid = (snelheid<<1)+curval;
            Serial.print("curval: ");
            Serial.println(curval );
            Serial.print("Windsnelheid: ");
            Serial.println(myWindsnelheid );
            Serial.print("snelheid : ");
            Serial.println(snelheid  );
            }
 /*       
// Serial.print (myWindsnelheid);
  Serial.print("  Snelheid => ");  
  if ( myWindsnelheid == "111111111") Serial.println("     0,0 m/s");  
  if ( myWindsnelheid == "011111111") Serial.println("     0,1 m/s");
  if ( myWindsnelheid == "101111111") Serial.println("     0,2 m/s");
  if ( myWindsnelheid == "110111111") Serial.println("     0,4 m/s");
  if ( myWindsnelheid == "111011111") Serial.println("     0,8 m/s");
  if ( myWindsnelheid == "111101111") Serial.println("     1,6 m/s");
  if ( myWindsnelheid == "111110111") Serial.println("     3,2 m/s");
  if ( myWindsnelheid == "111111011") Serial.println("     6,4 m/s");
  if ( myWindsnelheid == "111111101") Serial.println("     12,8 m/s");
  if ( myWindsnelheid == "111111110") Serial.println("     25,6 m/s");
  if ( myWindsnelheid == "001111111") Serial.println("     0,3 m/s");
  if ( myWindsnelheid == "110011111") Serial.println("     1,2 m/s");
  if ( myWindsnelheid == "110000011") Serial.println("     12,4 m/s");
  if ( myWindsnelheid == "111110011") Serial.println("     9,6 m/s");
  if ( myWindsnelheid == "111111100") Serial.println("     38,4 m/s");
  if ( myWindsnelheid == "000000000") Serial.println("     51,1 m/s");



  Serial.print("  Richting => "); 
   Serial.print (myWindRichting);
  if ( myWindRichting == "1111") Serial.println("     Noord");       
  if ( myWindRichting == "1110") Serial.println("     Zuid");     
  if ( myWindRichting == "1101") Serial.println("     Oost");      
  if ( myWindRichting == "1100") Serial.println("     West");     
  if ( myWindRichting == "1011") Serial.println("     Noord/Oost");
  if ( myWindRichting == "1010") Serial.println("     Zuid/West");
  if ( myWindRichting == "1001") Serial.println("     Zuid/Oost");
  if ( myWindRichting == "0111") Serial.println("     Noord/Noord/Oost");
  if ( myWindRichting == "1000") Serial.println("     Noord/West");
  if ( myWindRichting == "0110") Serial.println("     Zuid/Zuid/West");
  if ( myWindRichting == "0101") Serial.println("     Oost/Zuid/Oost");
  if ( myWindRichting == "0100") Serial.println("     ZW");
  if ( myWindRichting == "0011") Serial.println("     Oost/oost/Noord");
  if ( myWindRichting == "0010") Serial.println("     WNW");
  if ( myWindRichting == "0001") Serial.println("     Zuid/Zuid/Oost");
  if ( myWindRichting == "0000") Serial.println("     Noord/Noord/West");
*/
}

Het lijkt me dat de transformatie van je tekst naar een getal zo werkt.

ivanflo: Denk eraan, alles moet nog op een LCD schermpje komen... En geïntegreerd worden in de Klok samen met atmosferische eenheden.[/i]

Daar moet jij aan denken niet ik. ]:D

Met vriendelijke groet Jantje