INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 2 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Thermometer mit 7 Segment Anzeige
07.05.2016, 16:31
Beitrag #1
Thermometer mit 7 Segment Anzeige
Hi, brauch mal wieder Eure Hilfe!

Ich möchte mir ein Thermometer mit 7 Segmentanzeiger bauen. Im Testaufbau funktioniert es auch super, nur leider bekomme ich keine Stelle nach dem Komma angezeigt. z.B. 21,6°C... wie kann ich das realisieren?
Hier mein Sketch:
Code:
#include <DallasTemperature.h>
#define DATA 10
#define LATCH 8
#define CLOCK 9

#include <OneWire.h>

int DS18S20_Pin = 6;
int digits[] = {252, 96, 218,242, 102, 182, 190, 224, 254, 246, 238, 62, 156, 122, 158, 142};
OneWire ds(DS18S20_Pin);

void setup(void) {
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
Serial.begin(9600);
}

void displayNumber(int8_t n)
{
byte left = 0;
byte mitte = 0;
byte right = 0;
int8_t absN = n;
if(absN < 0) {
  left = 2;
  absN *= -1;
};
if(absN >= 10) {
  mitte = digits[absN / 10];
}else{
  mitte = left;
  left = 0;
};
right = digits[absN % 10];

digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, LSBFIRST, right);
shiftOut(DATA, CLOCK, LSBFIRST, mitte);
shiftOut(DATA, CLOCK, LSBFIRST, left);  
digitalWrite(LATCH, HIGH);
}


void loop(void) {
float temperature = getTemp();
Serial.println(temperature);
displayNumber(temperature);
delay(5000);

}

float getTemp(){


byte data[12];
byte addr[8];

if ( !ds.search(addr)) {

ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);


for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB);
float TemperatureSum = tempRead / 16;

return TemperatureSum;

}

Vielen Dank ottii50
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.05.2016, 19:16 (Dieser Beitrag wurde zuletzt bearbeitet: 07.05.2016 19:20 von rkuehle.)
Beitrag #2
RE: Thermometer mit 7 Segment Anzeige
Hallo ottii50,

man sieht zwar nicht wirklich was du verbaut hast (außer dem DS18-Sensor), was aber auffällt ist, dass getTemp() zwar einen float zurückgibt, dieser jedoch als uint8_t (also ausschließlich positive Ganzzahl) an displayNumber() übergeben wird. Da fallen die Kommastellen halt weg.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.05.2016, 19:52
Beitrag #3
RE: Thermometer mit 7 Segment Anzeige
Danke!
Verbaut ist im Testaufbau ein Arduino Nano, 4 x 7 Segmentanzeige, 4 x Schieberegister 595 und der DS 18b20.

Das mit dem "uint8_t " wusste ich nicht, habe es von meinem Funkthermometer übernommen.

Also sollte ich mit "void displayNumber(int n)" arbeiten?

Und noch eine Zahl z.B. right2 deklarieren?

Gruß......ottii50
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.05.2016, 20:56 (Dieser Beitrag wurde zuletzt bearbeitet: 07.05.2016 20:59 von rkuehle.)
Beitrag #4
RE: Thermometer mit 7 Segment Anzeige
Hallo otti50,
hier mal wie man es machen kann (mit ein paar Kommentaren und Ausgaben):
Code:
void setup() {
  Serial.begin(9600);
  float f = 14.5664; // der Float aus dem Sensor
  char buf[6]; // Pufferarray für Character
  int zvp=0; // Zahl vor Punkt
  int znp=0; // Zahl nach Punkt
  // max. 5 Stellen inkl. Punkt, davon zwei Stellen nach dem Punkt
  dtostrf(f, 5, 2,buf);
  Serial.print(F("Character: "));
  Serial.println(buf);
  String sbuf(buf); // Pufferarray als String
  Serial.print(F("String: "));
  Serial.println(sbuf);
  zvp=sbuf.toInt();
  Serial.print(F("Zahl vor Punkt: "));
  Serial.println(zvp);
  znp=sbuf.substring(3).toInt();
  Serial.print(F("Zahl nach Punkt: "));
  Serial.println(znp);
  // jetzt zvp und znp als uint8_t an die Displayroutine übergeben
}
void loop() {}
Hope it helps!
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.05.2016, 17:37
Beitrag #5
RE: Thermometer mit 7 Segment Anzeige
Hi, nun versteh ich gar nichts mehr!
In meinem Code werden im Seriellen Monitor schon die zwei Stellen nach dem Komma angezeigt. Die erste nach dem Komma wollte ich nun noch zu den 7 Segmenten übertragen.
Gruß ottii50
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.05.2016, 20:10
Beitrag #6
RE: Thermometer mit 7 Segment Anzeige
Ich bin am verzweifeln, hab es jetzt so geschrieben, in der Anzeige nur 4 Striche. Also das G vom 7 Segment!

Code:
#include <DallasTemperature.h>
#define DATA 10
#define LATCH 8
#define CLOCK 9

#include <OneWire.h>

int DS18S20_Pin = 6; //DS18b20
int digits[] = {252, 96, 218,242, 102, 182, 190, 224, 254, 246, 238, 62, 156, 122, 158, 142};
OneWire ds(DS18S20_Pin);

void setup(void) {
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
Serial.begin(9600);
  float f = 14.5664; // der Float aus dem Sensor
  char buf[6]; // Pufferarray für Character
  int zvp=0; // Zahl vor Punkt
  int znp=0; // Zahl nach Punkt
  // max. 5 Stellen inkl. Punkt, davon zwei Stellen nach dem Punkt
  dtostrf(f, 5, 2,buf);
  Serial.print(F("Character: "));
  Serial.println(buf);
  String sbuf(buf); // Pufferarray als String
  Serial.print(F("String: "));
  Serial.println(sbuf);
  zvp=sbuf.toInt();
  Serial.print(F("Zahl vor Punkt: "));
  Serial.println(zvp);
  znp=sbuf.substring(3).toInt();
  Serial.print(F("Zahl nach Punkt: "));
  Serial.println(znp);
  // jetzt zvp und znp als uint8_t an die Displayroutine übergeben

}

void displayNumber(int8_t n)
{
int zvp = 0;
int znp = 0;
int absN = n;

zvp = n % 10;
znp = n / 10;

digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, LSBFIRST, zvp);
shiftOut(DATA, CLOCK, LSBFIRST, znp);
digitalWrite(LATCH, HIGH);
}

void loop(void) {

float temperature = getTemp();
Serial.println(temperature);
displayNumber(temperature);
delay(5000);

}

float getTemp(){


byte data[12];
byte addr[8];

if ( !ds.search(addr)) {

ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);


for (int i = 0; i < 9; i++) {
data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB);
float TemperatureSum = tempRead / 16;

return TemperatureSum;

}

Wo ist der Fehler???
Warum kann ich die Serial.println(temperature);
nicht auf die 7 Segmentanzeige übertragen?

Gruß ottii50
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.05.2016, 20:28 (Dieser Beitrag wurde zuletzt bearbeitet: 13.05.2016 20:45 von Mathias.)
Beitrag #7
RE: Thermometer mit 7 Segment Anzeige
Du schreibst, du hast vier 959 und vier Anzeigne verbaut, dann müssten eigentlich 4 shiftOut kommen und nicht nur 2.
Zitat:digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, LSBFIRST, zvp);
shiftOut(DATA, CLOCK, LSBFIRST, znp);
digitalWrite(LATCH, HIGH);

Die Berechnung müsste für die 4 Ziffern etwa so aussehen:

Zitat: byte zahl[4];

zahl[0] = n % 10;
zahl[1] = n % 100 / 10;
zahl[2] = n % 1000 / 100;
zahl[3] = n / 1000;

digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, LSBFIRST, zahl[0]);
shiftOut(DATA, CLOCK, LSBFIRST, zahl[1]);
shiftOut(DATA, CLOCK, LSBFIRST, zahl[2]);
shiftOut(DATA, CLOCK, LSBFIRST, zahl[3]);
digitalWrite(LATCH, HIGH);

Für n ist ein int8 sowieso zu klein, verwende ein normaler int.

Zitat:int n = round(temperature * 100);

Ich hoffe dir hilft dies weiter.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2016, 16:27
Beitrag #8
RE: Thermometer mit 7 Segment Anzeige
Danke Mathias,
komm nicht weiter. So langsam sehe ich nicht mehr durch!
Bei dem folgendem Code leuchtet bei der 3. Ziffer wieder das "G", sonst nix.

Code:
#include <DallasTemperature.h>
#define DATA 10
#define LATCH 8
#define CLOCK 9

#include <OneWire.h>

int DS18S20_Pin = 6; //DS18S20
int digits[] = {252, 96, 218,242, 102, 182, 190, 224, 254, 246, 238, 62, 156, 122, 158, 142};
OneWire ds(DS18S20_Pin);

int temperature;
int n = round(temperature*100);

void setup(void) {
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
Serial.begin(9600);
}

void displayNumber(int n)
{
byte zahl[4];
zahl[0] = n % 10;
zahl[1] = n % 100 / 10;
zahl[2] = n % 1000 / 100;
zahl[3] = n / 1000;

    digitalWrite(LATCH, LOW);
    shiftOut(DATA, CLOCK, LSBFIRST, zahl[0]);
    shiftOut(DATA, CLOCK, LSBFIRST, zahl[1]);
    shiftOut(DATA, CLOCK, LSBFIRST, zahl[2]);
    shiftOut(DATA, CLOCK, LSBFIRST, zahl[3]);
    digitalWrite(LATCH, HIGH);
}

void loop(void) {
float temperature = getTemp();
Serial.println(temperature);
displayNumber(temperature);
delay(5000);

}

float getTemp(){

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);

for (int i = 0; i < 9; i++) {
data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB);
float TemperatureSum = tempRead / 16;

return TemperatureSum;

}

Gruß ottii50
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Anzeige von Daten FreDicnc 9 488 24.06.2017 11:09
Letzter Beitrag: FreDicnc
  DS18B20 Pool-Thermometer mit 7Seg.-Anzeige Evilgnievel 19 738 23.06.2017 09:27
Letzter Beitrag: Tommy56
  Zeitabhängige LED Anzeige mit 2x4 Input Abfrage do1xxy 2 198 05.03.2017 19:25
Letzter Beitrag: do1xxy
  TFT Anzeige Tellen 7 429 14.02.2017 22:04
Letzter Beitrag: hotsystems
  Anzeige ruhiger halten Franz54 9 684 19.12.2016 01:28
Letzter Beitrag: SkobyMobil
  merkwürdige Anzeige bei lektion 17 lecker16 7 830 20.11.2016 22:40
Letzter Beitrag: Tommy56
Smile Datum Anzeige mit 7 Segmentanzeige ottii50 11 1.162 16.05.2016 19:12
Letzter Beitrag: Mathias
  Leonardo- Anzeige von MIDI-Daten an ws2812b Modinox 7 667 26.01.2016 13:11
Letzter Beitrag: Bitklopfer
  OLED Display anzeige von Logo falsch ! b3ta 0 541 23.01.2016 15:12
Letzter Beitrag: b3ta
  8 LED , 7-Segment-Elemente einzeln ansteuern beim tm1638 und die Buttons arduinofan 0 852 15.01.2016 22:37
Letzter Beitrag: arduinofan

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste