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
  Hilfe bei der Programmierung Digitaluhr ,mit Anzeige 32x8 Lora 1 241 10.03.2018 11:44
Letzter Beitrag: hotsystems
  NTC für LCD-Anzeige.Weiter bekomme ich nicht hin malsehen 17 929 09.03.2018 20:28
Letzter Beitrag: malsehen
  Wieder 7 Segment LED daja64 2 227 21.02.2018 22:41
Letzter Beitrag: daja64
  ILI9341 MEGA2560 keine BMP anzeige tillmg 4 323 08.02.2018 20:18
Letzter Beitrag: georg01
  LED riesen 7 Segment Uhr mit Thermometer wolfi_FL 6 335 05.02.2018 21:11
Letzter Beitrag: Tommy56
  Hilfe!!! bei 7-Segment Anzeige Markus2018 9 686 31.01.2018 21:14
Letzter Beitrag: Tommy56
  Anzeige von Daten FreDicnc 9 1.461 24.06.2017 11:09
Letzter Beitrag: FreDicnc
  DS18B20 Pool-Thermometer mit 7Seg.-Anzeige Evilgnievel 19 1.830 23.06.2017 09:27
Letzter Beitrag: Tommy56
  Zeitabhängige LED Anzeige mit 2x4 Input Abfrage do1xxy 2 718 05.03.2017 19:25
Letzter Beitrag: do1xxy
  TFT Anzeige Tellen 7 1.127 14.02.2017 22:04
Letzter Beitrag: hotsystems

Gehe zu:


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