Pages: [1]   Go Down
Author Topic: DS18B20 + SAA1064 - wie programmtechnisch verknüpfen?  (Read 448 times)
0 Members and 1 Guest are viewing this topic.
Germany, Dresden
Offline Offline
Sr. Member
****
Karma: 16
Posts: 471
30 Jahre Elektronikbastelei, Programmieren null Ahnung!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich komme nicht weiter  smiley-red
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:
/*
 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 bus
byte 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~F
void 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 pin
to GND) but 0x38 and Arduino uses 7-bit addresses- so 8-bit addresses have to
be 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  smiley-cry

Gruß Gerald
Logged

rot ist blau und Plus ist Minus

Offline Offline
Faraday Member
**
Karma: 132
Posts: 4241
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: