Forum: Mikrocontroller und Digitale Elektronik HYT 221 Werte auf LCD


von Matthias K. (gidarrnmatze)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich möchte zur Zeit einen HYT 221 über I2C Ansprechen und Abfragen.
Ich bediene mich den ic2-Routinen von Peter Fleury.

Mir ist es möglich den Sensor anzusprechen, nur tauchen dann auf dem LCD 
nur wirre Zeichen auf.

Die Frage: mache ich einen Fehler mit den Datentypen uint8 und uint 16?
Ist für die Ausgabe am Display eine weitere Umrechnung nötig?

Vielen Dank für Eure Hilfe
Matthias

von Achim M. (minifloat)


Lesenswert?

Matthias Kugler schrieb:
> Die Frage: mache ich einen Fehler mit den Datentypen uint8 und uint 16?
> Ist für die Ausgabe am Display eine weitere Umrechnung nötig?

Du musst deinen wie auch immer gearteten 16bit-Zahlenwert erst in eine 
Zeichenkette umwandeln. Das geht z.B. damit:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#LCD_Beispiel_2
mfg mf

von Matthias K. (gidarrnmatze)


Lesenswert?

Vielen Dank für die Info,

Ich hab den Code so abgeändert:
[c]raw_RH16 = AusleseBuffer[0] < 8 | AusleseBuffer[1];
  raw_T16 = AusleseBuffer[2] < 8 | AusleseBuffer[3];

  RH = ( raw_RH16 * 100 ) / 2^14;
  T = (( raw_T16 * 165 ) / 2^14 ) - 40;
  T /=4;

  char RHchar[20],Tchar[20];
   itoa( RH, RHchar, 10 );
   itoa( T, Tchar, 10 );

  lcd_clear();
  lcd_setcursor( 0, 1 );
  lcd_string(RHchar);
  lcd_setcursor( 0, 2 );
  lcd_string(Tchar);[c]

Leider bekomme ich noch immer irgendwelche sinnlosen Zahlen.
Kann es sein das meine Auslesung nicht i.O. ist?

mfg

von Achim M. (minifloat)


Lesenswert?

Matthias Kugler schrieb:
> 2^14

0b00000010 EXOR 0b00001110 = 0b00001100 = 0x0C = 12
Das war bestimmt nicht gewollt, oder? exklusiv-oder?
Für "x hoch y" nimmt man die pow()-Funktion.
Dazu brauchst du die math.h; sobald du die aber einbindest und das hier 
benutzt, wird in Fließkommazahlen gerechnet. Das frisst Flash und 
Rechenzeit. Darum schau dich mal nach "Bitoperationen", 
"Schiebeoperator" und "Festkommaarithmetik" um(bemüh die Forensuche).

Für Unsigned 16-Bit Zahlen kann man  zum Umwandeln in ein String z.B. 
folgendes hernehmen(auch wenn es nicht sonderlich effizient ist):
1
uint16_t number = 12345;
2
uint16_t buffer;
3
uint8_t mystring[6];
4
5
//Zehntausender
6
buffer = number / 10000;
7
mystring[0] = buffer + '0';
8
number = number - (buffer * 10000);
9
//Tausender
10
buffer = number / 1000;
11
mystring[1] = buffer + '0';
12
number = number - (buffer * 1000);
13
//Hunderter
14
buffer = number / 100;
15
mystring[2] = buffer + '0';
16
number = number - (buffer * 100);
17
//Zehner
18
buffer = number / 10;
19
mystring[3] = buffer + '0';
20
number = number - (buffer * 10);
21
//Einer... das mit dem Buffer und der 1
22
//hier nur zur Einheitlichkeit des Codes
23
buffer = number / 1;
24
mystring[4] = buffer + '0';
25
number = number - (buffer * 1);
26
//String mit Stringende-Zeichen abschliessen
27
mystring[5] = '\0';
28
29
//Ausgeben
30
lcd_clear();
31
lcd_setcursor( 0, 1 );
32
lcd_string(mystring);
Dein Part ist es jetzt, das Ganze in eine Funktion zu packen.
Irgendwo hier im Forum gab es auch schon mal eine ("selbstgeschriebene", 
als Platzsparend bekannte)ItoA()-Funktion, die Signed 16-Bit Zahlen 
verarbeitet(Auch mal suchen, bitte).
mfg mf

PS: Das C-Beispiel ist dazu gedacht, dass du dir ausdenkst, wo und wie 
das Komma hier irgendwo rein kommen könnte. Und überleg dir, wie man 
einen gegebenen Zahlenbereich mit maximaler Genauigkeit ausnutzt.

von Matthias K. (gidarrnmatze)


Lesenswert?

Ich habe das Problem gelöst und bekomme jetzt Daten auf dem LCD 
ausgegeben, die i.O. sind!
Mein Fehler war unter anderem das Bitschieben!

Iach hatte fälschlicherweise geschrieben:
"raw_T16 = AusleseBuffer[2]< 8" dabei muss es ja << 8 heißen!

Vielen Danke für deine Hilfe und Hinweise!
mfg
1
raw_RH16 = AusleseBuffer[0] * 256 + AusleseBuffer[1];
2
raw_T16 = AusleseBuffer[2]<< 8 | AusleseBuffer[3];
3
raw_T16 /=4 ;
4
5
RH =(100  / pow(2,14)) * raw_RH16;
6
T = (165  / pow(2,14)) * raw_T16 -40;
7
8
char Buffer1[20], Buffer2[20]; // in diesem {} lokal
9
itoa(RH, Buffer1, 10 ); 
10
itoa( T, Buffer2, 10 ); 
11
   
12
  lcd_clear();
13
  lcd_setcursor( 0, 1 );
14
  lcd_string("rF ");
15
  lcd_setcursor( 3, 1 );
16
  lcd_string(Buffer1);
17
  lcd_setcursor( 5, 1 );
18
  lcd_string("%");
19
  
20
  lcd_setcursor( 0, 2 );
21
  lcd_string("T ");
22
  lcd_setcursor( 2, 2 );
23
  lcd_string(Buffer2);
24
  lcd_setcursor( 5, 2 );
25
  lcd_string("C");

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.