Go Down

### Topic: DS18B20 + SAA1064 - wie programmtechnisch verknüpfen? (Read 1 time)previous topic - next topic

#### nix_mehr_frei

##### Aug 14, 2013, 07:35 pm
Hallo,

ich komme nicht weiter
Da ein 16x2 LCD Display aus größerer Entfernung kaum noch zu lesen ist, habe ich mich für gute alte 7-Segment LED Anzeigen entschieden. Die Hardware ist auch nicht das Problem. Der Beispielsketch für den SAA1064 funktioniert auch.

Code: [Select]
`/* Example 39.1 - NXP SAA1064 I2C LED Driver IC Demo I Demonstrating display of digits http://tronixstuff.com/tutorials > chapter 39 John Boxall July 2011 | CC by-sa-nc */#include "Wire.h" // enable I2C busbyte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND) ****int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};// these are the byte representations of pins required to display each digit 0~9 then A~Fvoid setup(){ Wire.begin(); // start up I2C bus delay(500); initDisplay();}void initDisplay()// turns on dynamic mode and adjusts segment current to 12mA{ Wire.beginTransmission(saa1064); Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte Wire.write(B01110111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current Wire.endTransmission();}void displayDigits()// show all digits 0~9, A~F on all digits of display{ for (int z=0; z<16; z++) { Wire.beginTransmission(saa1064); Wire.write(1); // instruction byte - first digit to control is 1 (right hand side) Wire.write(digits[z]); // digit 1 (RHS) Wire.write(digits[z]); // digit 2 Wire.write(digits[z]); // digit 3 Wire.write(digits[z]); // digit 4 (LHS) Wire.endTransmission(); delay(500); }// now repeat but with decimal point for (int z=0; z<16; z++) { Wire.beginTransmission(saa1064); Wire.write(1); // instruction byte - first digit to control is 1 (right hand side) Wire.write(digits[z]+128); // digit 1 (RHS) Wire.write(digits[z]+128); // digit 2 Wire.write(digits[z]+128); // digit 3 Wire.write(digits[z]+128); // digit 4 (LHS) Wire.endTransmission(); delay(500); }}void clearDisplay()// clears all digits{ Wire.beginTransmission(saa1064); Wire.write(1); // instruction byte - first digit to control is 1 (right hand side) Wire.write(0); // digit 1 (RHS) Wire.write(0); // digit 2 Wire.write(0); // digit 3 Wire.write(0); // digit 4 (LHS) Wire.endTransmission();}void loop(){ displayDigits(); clearDisplay(); delay(1000);}/* **** We bitshift the address as the SAA1064 doesn't have the address 0x70 (ADR pinto GND) but 0x38 and Arduino uses 7-bit addresses- so 8-bit addresses have tobe shifted to the right one bit. Thanks to Malcolm Cox */`

Den Segmentstrom habe ich schon auf das Maximum von 21 mA hochgedreht mit  Wire.write(B01110111)
Die linke Stelle habe ich kopfstehend montiert, da sie °C zeigen soll. Wenn ich bei int digits 143 hinterlege, erscheint auch das stilisierte °C
Nur was ich nicht gebacken kriege, wie ich vom Temperatursensor aus den 12 Bits Binär auf meine einzelnen Stellen komme. Ach ja, das Minus bei negativer Temperatur würde ich mit 64 angezeigt bekommen. In der zweiten Stelle von links müßte ich dann noch den dezimalpunkt ansteuern, also 128 addieren...
Nur wie die beiden Codeschnipsel verwurstet werden müssen, habe ich keinen Plan.
Von einem normalen LCD auf ein I2C-LCD "umzustricken", habe ich hin bekommen. Nur hat der SAA1064 nicht so viel Eigenintelligenz, wie ein 16x2 LCD *kopfkratz*
Google habe ich auch schon bemüht... Beides für sich ist problemlos zu finden, aber beides in Kombination - Bilder ja, Code nein  =(

Gruß Gerald
rot ist blau und Plus ist Minus

#### Serenifly

#1
##### Aug 14, 2013, 08:59 pm
Zahlen in einzelne Ziffern zu zerlegen geht einfach mit wiederholter Modulo-Division und Division durch 10. z.B. 123:

123 % 10 = 3 -> 1. Ziffer
123 / 10 = 12
12 % 10 = 2 -> 2. Ziffer
12 / 10 = 1
1 % 10 = 1 -> 3. Ziffer
1 / 10 = 0

Das kann man in einer while-Schleife machen bis die Zahl 0 ist. Wenn du eine Nachkomma-Stelle hast multiplizierst du du die Zahl vorher einfach mit 10, so dass z.B. aus 23.5 -> 235 wird.

Go Up