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
  merkwürdige Anzeige bei lektion 17 lecker16 7 135 20.11.2016 22:40
Letzter Beitrag: Tommy56
Smile Datum Anzeige mit 7 Segmentanzeige ottii50 11 894 16.05.2016 19:12
Letzter Beitrag: Mathias
  Leonardo- Anzeige von MIDI-Daten an ws2812b Modinox 7 479 26.01.2016 13:11
Letzter Beitrag: Bitklopfer
  OLED Display anzeige von Logo falsch ! b3ta 0 331 23.01.2016 15:12
Letzter Beitrag: b3ta
  8 LED , 7-Segment-Elemente einzeln ansteuern beim tm1638 und die Buttons arduinofan 0 493 15.01.2016 22:37
Letzter Beitrag: arduinofan
  8x7 Segment LED Anzeige / Sketch verändern w1ck3d 3 638 23.11.2015 17:56
Letzter Beitrag: hotsystems
  7-Segment Multiplex, überblendet Mathias 4 708 18.11.2015 17:22
Letzter Beitrag: Mathias
  Drehzahl Anzeige Analog (neuling) Kuxii 9 1.105 30.10.2015 12:01
Letzter Beitrag: hotsystems
  Sieben Segment LED Anzeige Tellen 10 1.810 18.06.2015 21:21
Letzter Beitrag: Tellen
  fehler in anzeige von float avoid 11 1.904 12.04.2015 16:32
Letzter Beitrag: HaWe

Gehe zu:


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