Inlezen gegevens - "Woord"

Beste leden,
Mijn eerste stappen zijn er nog steeds.

Ik heb een windsensor tx 23 op de kop kunnen tikken.

Deze geeft bedraad dergelijk signaal uit:

Dit betekent een signaal van 42 bites. en dat resulteert in een woord van 42bites lang.

Hoe kan ik iets dergelijks uitlezen in mijn Arduino256 en hoe filter ik de windrichting en de windkracht eruit.

Section Length (bits) Inverted? Endianness Description Notes
A 5 Yes LSB first Start Frame Always 00100
B 4 Yes LSB first Wind Direction 0-15, see table below
C 12 Yes LSB first Wind Speed 0-511
D 4 Yes LSB first Checksum (deze heb ik nodig)
E 4 No LSB first Wind Direction 0-15, see table below
F 12 No LSB first Wind Speed 0-511

Alvast bedankt

Wat is precies je vraag? Krijg je een bit patroon van 42 bits binnen? of 42 bytes die of een 1 of 0 bevatten. En het resultaat moet vervolgens opgebroken worden in de verschillende variabelen?

Mischien helpt dit : La Crosse TX23U Anemometer Communication Protocol – john.geek.nz
Is wel in het engels.

Have fun,
Guido

Enig idee waar ivanflo zijn plaatje vandaan zou hebben ?

van http://www.john.geek.nz/
zie maar http://www.john.geek.nz/wp-content/uploads/2012/08/La_Crosse_TX23U_Protocol.png
Best regards
Jantje

(Pssst, dat wist ik wel, maar wist DeepZ dat ook ?)

Ik dacht al....

Dag,
Het spijt me dat ik de bron vermelding er niet bij heb geplaatst.
Hoe dan ook, ik had inderdaad graag met deze wind meter de gegevens ingelezen.

Hoe doe ik dit het beste.

Inderdaad een zoveelste weerstation.... dit komt er ook nog bij

Alvast bedankt

De bron staat al in het plaatje vermeld (maar misschien moet je daarvoor naar rechts scrollen), dus daar zit geen probleem.

Die windmeter is een apart ding.
Je moet m namelijk triggeren, waarna dat ding ineens een berg data spuit (42 bits dus).
Dus je moet zelf eerst van de pin die je gebruikt de pullup activeren.
Als je klaar bent om data te ontvangen, moet je die pin heel kort (iets van 5 milliseconden gok ik) laag maken.
Even later (weer zo'n 5 milliseconden), na het vrijgeven van die pin, trekt de sensor 'm 20 milliseconden laag, als een soort van bevestiging dat er data aan zit te komen.
Dan weer een startsignaal, waarna de bits in èèn riedel komen.
Ik denk dat je hiervoor niet de seriele pins 0 en 1 kunt gebruiken, vanwege het laag moeten maken van die pin.
Dus kom je dan op softserial uit.
Maar ik heb geen idee of je dan wel die pin even laag kunt maken en dan nog op tijd bent om alle gewenste informatie binnen te halen en te verwerken.

Die druksensor zal best meevallen.
Ik zie er een adafruit logo opstaan en daar zul je vast gemakkelijk voorbeeld code van kunnen vinden en toepassen.

@Mas3 bedankt voor je insteek.

En het wordt me duidelijker.

Mijn vraag is dan ook, het in geen analoge input, wel een digitale input.

dur dergelijk commando zal het niet wezen

pinMode(buttonPin, INPUT)

Welk stukje code moet ik dan gebruiken.

Alvast bedankt.

Als je in de reference pages (klik !) kijkt, vind je dat er ook nog zoiets is als:

  pinMode(somePin, INPUT_PULLUP);

En verder is daarover hier ook nog wat te vinden (deze link vind je ook als je de link hierboven volgt).

MAS3 Bedankt opnieuw voor je inbreng.
Jou linken hebben me opnieuw aan het zoeken gezet, en ja ik heb alles gevonden, en zelfs meer...

Dit is wat ik zocht:

int dataPin = 8;
int bitlenght = -1;
char data[41];

Hier lees ik op pin 8 een bitlengte in van 1 en dit voor alle 41 tekens...

En hier vindt je het gehele programma:
http://forum.arduino.cc/index.php?topic=62753.0
of tenminste de engelse topic...

Recent heb ik (uit een bijdrage van robtillaart) begrepen dat het beter is om die datapin (die never nooit niet (3 x negatief == negatief) zal veranderen), als een const te definiëren.
Ik meen dat het daarmee een vaste waarde word (die alleen in de compiler ruimte nodig heeft) en niet een variabele waarvoor ruimte in je "werkgeheugen" gereserveerd moet worden, en dat lijkt te worden bevestigd in de reference pages door de koppeling aan/relatie met #define.
Dat zal vermoedelijk niet gelden voor bitlength, die je hier als -1 definieert en niet als 1 zoals je zei.
-1 betekent vaak (nog) niet beschikbaar danwel leeg (nul is anders als leeg), maar er word zo wel ruimte voor gereserveerd.

Voor een korte sketch maakt dat vermoedelijk niet veel uit, maar het is wel beter als dit zo vroeg mogelijk word toegepast.

MAS3:
Recent heb ik (uit een bijdrage van robtillaart) begrepen dat het beter is om die datapin (die never nooit niet (3 x negatief == negatief) zal veranderen), als een const te definiëren.

Ik ben zelf meer een voorstander van

#define pin 12

Ik heb gemerkt dat bijvoorbeeld

const int pin = 12;

8 bytes code meer gebruikt zodra je een simpele move naar een variabele doet tov. de define.

nicoverduin:
Ik ben zelf meer een voorstander van

#define pin 12

Ik heb gemerkt dat bijvoorbeeld

const int pin = 12;

8 bytes code meer gebruikt zodra je een simpele move naar een variabele doet tov. de define.

Sommige mensen houden niet van #define en #ifdef :astonished:
Maar ik vermoed dat die alleen maar kleine sketches maken of op een Arduino Mega of due werken.
Arduino zelf gebruikt String in de bridge library die geschreven is voor een yun die 32k (-4k bootloader) heeft en dat terwijl je linino kunt gebruiken om die string operaties te doen :astonished:
Met vriendelijke groet
Jantje

Watte ?

(in dezelfde reference pages vond ik dat const geprefereerd dient te worden boven #define, ik weet niet waarom)

hier staat dat arduino liever const dan define heeft. http://arduino.cc/en/Reference/Const
En hier een extrat uit de bridge

class Process : public Stream {
  public:
    // Constructor with a user provided BridgeClass instance
    Process(BridgeClass &_b = Bridge) :
      bridge(_b), started(false), buffered(0), readPos(0) { }
    ~Process();

    void begin(const String &command);
    void addParameter(const String &param);
    unsigned int run();
    void runAsynchronously();
    boolean running();
    unsigned int exitValue();
    void close();

    unsigned int runShellCommand(const String &command);
    void runShellCommandAsynchronously(const String &command);

....

};

Waarom dat het niet char* mag zijn lezen we wel eens op een referece page ]:smiley:
Ik heb men eigen stukjes bridge class geschreven zonder String.

Met vriendelijke groet.
Jantje

Toch enigzins getriggered :grin: Op die Arduino pagina staat eigenlijk niets ... zoals wel op meerdere. Het enige goede argument die ik tot nu toe kon vinden was dat daar het een preprocessor directive is, de preprocessor gewoon de tekst vervangt. En dus tijdens debugging dit niet meer zichtbaar maakt. En dat is logisch :slight_smile:
Maar voor mijn pin definities en nog wat andere zaken :slight_smile: ga ik wel op deze manier door. 8 bytes lijkt niet veel, maar als je het nogal wat keren nodig hebt kan het een issue worden.
En een hardware debugger heb ik niet :slight_smile: is me nog ff te prijzig.... En de defines kleuren ook zo lekker blauw in mijn Eclipse omgeving. Dan weet ik automatisch dat ik een define te pakken heb. Ach elk nadeel heeft zijn voordeel... Was een of andere voetballer die dat geloof ik ooit zei :grin:

Ik ben heel blij dat er een gezellig draadje ontstaat.
Voor mij ook een goed onderwerp.
En ja ik gebruik een MEGA. omdat ik deze op de kop kon tikken.

Maar daar is het eigenlijke onderwerp een beetje op de achtergrond geraakt.

Hoe kan ik een pulstrein(van 41 bites) binnen halen?
Alvast bedankt.

Ondertussen werkt mijn BMP08 als een lier....
Daar gaan mijn sda/scl ingangen, dus.
Indien dit een I²C ingang is, kan er daar niet meer I²C items aan hangen?
Dat was toch de bedoeling van I²C, of ben ik verkeerd?

I2C kan meerdere devices over hetzelfde lijntje hebben. Elk device heeft zijn eigen adres. Dus kan je gewoon een ander device adres kiezen om die te bereiken. En als dat te gek wordt kun je ook nog SoftI2C overwegen :slight_smile: