ich arbeite seit ca. 2 Monaten mit dem Arduino UNO und hab schon mehrere Sachen ausprobiert und alles hin bekommen was ich wollte.
Leider komme ich momentan nicht weiter....
...Ich versuche einen Luftstromsensor der Firma Sensirion (Smart sensor solutions) auszulesen.
Ich habe bereits mit der i2c Schnittstelle gearbeitet. Dort steuerte ich ein Display und ein Uhrenmodul an.
Mein momentanes Programm sieht wie folgt aus:
Ich habe den Sensor über i2c Scan gefunden und ihn angesprochen. Leider weiß ich nicht wie ich die Sendebefehle und Readbefehle im Datenblatt interpretieren soll...
zwar ein Byte definierst, dem aber 16 Bit mitgibst, das geht nicht. Definiere stattdessen lieber 2 Byte, da du die später nacheinander senden musst.
Nachdem du die beiden Bytes gesendet hast musst du auf Empfang gehen. Der Sensor will 3 Bytes senden, also lautet der Befehl
Wire.requestFrom(flow_address, 3);
Danach musst du dann 3x Wire.read() aufrufen. Wenn du die Antwort ausgibst denke daran, dass hier keine Character zurückkommen.
Schau dir in den Examples unter Wire mal das Beispiel SFRRanger_reader an, dort wird der Wechsel zwischen Command senden und Antwort empfangen deutlich.
Ich habe mir das Beispiel mal angeschaut. Leider werde ich aus dem Datenblatt nicht schlau. Ich sende einen Befehl als HEX (h1000) und werde anschließend doch den Flow Wert erhalten...
Das Empfangen "result" verstehe ich leider nicht. Anscheinend bekomme ich zuerst die Adresse, dann Data( was ist darin enthalten?) nochmals Data( was ist das?) und CRC (was ist das? )
Was haben die Zahlen dahinter zu bedeuteten?
Was muss ich vorher genau senden? Eigentlich doch nur den Befehlt als HEX also z.B. h1000=0x1000.
Bumbers of bytes read back ist 2 also muss ich Wire.requestFrom(flow_address, 2);
auf 2 stellen... oder?
#include "Wire.h"
#define flow_address 0x40 // Adresse Sensor
int dt = 10; // warten (10ms sollten reichen, wenn überhaupt)
byte rval_h = 0x10; // senden der Befehle
byte rval_l = 0x00; // senden der Befehle
unsigned int reading;
void setup() {
Wire.begin();
Serial.begin(9600);
}
void flowLoop() {
Wire.beginTransmission(flow_address);
Wire.write(rval_h); // Bit [15:8]
Wire.write(rval_l); // Bit [7:0]
Wire.endTransmission();
Serial.print(" sent - ");
Serial.print(rval_h, HEX);
Serial.println(rval_l, HEX);
delay(dt);
Wire.requestFrom(flow_address, 3); // 3 Bytes Antwort werden erwartet
if(3 <= Wire.available()) { // if two bytes were received
reading = Wire.read(); // receive high byte (overwrites previous reading)
reading = reading << 8; // shift high byte to be high 8 bits
reading |= Wire.read(); // receive low byte as lower 8 bits
Serial.println(reading); // print the reading
byte crc = Wire.read();
Serial.println(crc, HEX);
}
}
void loop(){
flowLoop();
}
(ungetestet, also ohne Gewähr)
Laut Datenblatt erwartet der Sensor 2 CMD Bytes und antwortet mit 3 Bytes. Das dritte Byte (CRC) ist eine Checksumme, siehe Kap 5 des Datenblatts (das Datenblatt solltest du schon einmal ganz lesen..)