Temperaturmesser mit LED-Anzeige

Hallo Forum,
ich habe zurzeit das Problem, ich wollte eine Temperatursensor mit einem LCD-Display verbinden, sodass ich die ergebnisse auf dem display sehen kann. (aufbau angehängt)
Das problem ist, die einzelprogramme für jeweils Temperatursensor und LCD-Anzeige funktionieren, wenn ich aber versuche die zu kombinieren, hört der Temperatursensor auf sich zu aktualisieren, und zeigt es nur mit den einzelzahlen abwechselnd blinkend das letzte Ergebnis auf dem Display an.

Code der Anzeige einzeln:

#include "Timer.h" //include timer library


Timer t; // craete a timer object
long number = 0; //declear the variables
int first_digit = 0;
int second_digit = 0;
int third_digit = 0;
int fourth_digit = 0;
int timer_event = 0;
int CA_1 = 4;
int CA_2 = 5;
int CA_3 = 6;
int CA_4 = 7;
int clk = 8;
int latch = 9;
int data = 10;
int count = 0;
int digits[4] ;
int CAS[4] = {4, 5, 6, 7};
byte numbers[10] {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};
//byte combinations for each number 0-9
void setup() {
  Serial.begin(9600); //serial start and pin config
  pinMode(CA_1, OUTPUT);
  pinMode(CA_2, OUTPUT);
  pinMode(CA_3, OUTPUT);
  pinMode(CA_4, OUTPUT);
  pinMode(clk, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);
  Serial.println("please Enter a number from 0 to 9999");
}

void loop() {
  t.update(); //timer update
  if (Serial.available()) { // read from serial
    t.stop(timer_event); //stop timer if anythign to read
    cathode_high(); // blank the screen
    String s = Serial.readString(); //read the serail value
    number = (long)s.toInt(); //convert it to int
    if (number > 9999) { //check the number is 0-9999
      Serial.println("Please Enter Number Between 0 - 9999");
    } else {
      break_number(number);
      timer_event = t.every(1, display_number); // start timer again
    }
  }
}

void break_number(long num) { // seperate the input number into 4 single digits

  first_digit = num / 1000;
  digits[0] = first_digit;

  int first_left = num - (first_digit * 1000);
  second_digit = first_left / 100;
  digits[1] = second_digit;
  int second_left = first_left - (second_digit * 100);
  third_digit = second_left / 10;
  digits[2] = third_digit;
  fourth_digit = second_left - (third_digit * 10);
  digits[3] = fourth_digit;
}

void display_number() { //scanning

  cathode_high(); //black screen
  digitalWrite(latch, LOW); //put the shift register to read
  shiftOut(data, clk, LSBFIRST, numbers[digits[count]]); //send the data
  digitalWrite(CAS[count], LOW); //turn on the relevent digit
  digitalWrite(latch, HIGH); //put the shift register to write mode
  count++; //count up the digit
  if (count == 4) { // keep the count between 0-3
    count = 0;
  }
}

void cathode_high() { //turn off all 4 digits
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);
}

Code des Temp-sensors einzeln (LED’s genutzt zur Temperaturdarstellung):

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 13

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);
float Temp = 0;
void setup(void)
{
  // Start serial communication for debugging purposes
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  pinMode (2, OUTPUT);
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
}

void loop(void){ 
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  
  Serial.print("Celsius temperature: ");
  // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Temp = sensors.getTempCByIndex(0);
  Serial.print(Temp); 
  Serial.print("\n");
  if (Temp < 90) {
    digitalWrite (3, LOW);
    digitalWrite (4, LOW);
    digitalWrite (5, LOW);
    digitalWrite (2, HIGH); }
  if((Temp >= 90) && (Temp < 95)) {
    digitalWrite (2, LOW);
    digitalWrite (4, LOW);
    digitalWrite (5, LOW);
    digitalWrite (3, HIGH); }
  if((Temp >= 95) && (Temp < 105)) {
    digitalWrite (2, LOW);
    digitalWrite (3, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, HIGH); }
  if(Temp >= 105) {
    digitalWrite (2, LOW);
    digitalWrite (3, LOW);
    digitalWrite (4, LOW);
    digitalWrite (5, HIGH); }
    
}

ich hänge die beiden originalprogramme und das kombinierte an.
Kombiniertes programm:

#include "Timer.h" //include timer library

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 13
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float Temp = 0;

Timer t; // craete a timer object
long number = 0; //declear the variables
int first_digit = 0;
int second_digit = 0;
int third_digit = 0;
int fourth_digit = 0;
int timer_event = 0;
int CA_1 = 4;
int CA_2 = 5;
int CA_3 = 6;
int CA_4 = 7;
int clk = 8;
int latch = 9;
int data = 10;
int count = 0;
int digits[4] ;
int CAS[4] = {4, 5, 6, 7};
byte numbers[10] {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};
//byte combinations for each number 0-9
void setup() {
  Serial.begin(9600); //serial start and pin config
  sensors.begin();
  pinMode(CA_1, OUTPUT);
  pinMode(CA_2, OUTPUT);
  pinMode(CA_3, OUTPUT);
  pinMode(CA_4, OUTPUT);
  pinMode(clk, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);
  Serial.println("please Enter a number from 0 to 9999");
}

void loop() {
 sensors.requestTemperatures();
  t.update(); //timer update
  if (Serial.available()) { // read from serial
    t.stop(timer_event); //stop timer if anythign to read
    cathode_high(); // blank the screen
    String s = Serial.readString(); //read the serail value
    number = sensors.getTempCByIndex(0);   //(long)s.toInt(); //convert it to int
    if (number > 9999) { //check the number is 0-9999
      Serial.println("Please Enter Number Between 0 - 9999");
    } else {
      break_number(number);
      timer_event = t.every(1, display_number); // start timer again
    }
    Serial.print("Celsius temperature: ");
    Temp = sensors.getTempCByIndex(0);
    Serial.print(Temp); 
    Serial.print("\n");
  }
}

void break_number(long num) { // seperate the input number into 4 single digits

  first_digit = num / 1000;
  digits[0] = first_digit;

  int first_left = num - (first_digit * 1000);
  second_digit = first_left / 100;
  digits[1] = second_digit;
  int second_left = first_left - (second_digit * 100);
  third_digit = second_left / 10;
  digits[2] = third_digit;
  fourth_digit = second_left - (third_digit * 10);
  digits[3] = fourth_digit;
}

void display_number() { //scanning

  cathode_high(); //black screen
  digitalWrite(latch, LOW); //put the shift register to read
  shiftOut(data, clk, LSBFIRST, numbers[digits[count]]); //send the data
  digitalWrite(CAS[count], LOW); //turn on the relevent digit
  digitalWrite(latch, HIGH); //put the shift register to write mode
  count++; //count up the digit
  if (count == 4) { // keep the count between 0-3
    count = 0;
  }
}

void cathode_high() { //turn off all 4 digits
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);
}

Kann mir da bitte einer helfen mit?
P.S. falls es einer weis und langeweile hat, es wäre toll wenn ich mindestens auch eine nachkommastelle sehen kann auf dem Display :disappointed_relieved:

display.ino (2.57 KB)

Temperature.ino (1.55 KB)

TempDisplay.ino (2.95 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Geändert, danke

Hab ich richtig gelesen, das deine Temperatur ein int ist?
Da gibt es so keine Nachkommastellen.

Ich mache mir da immer ne Hilfsvariable, in der ich den Wert mit 100 multipliziere,

Dann float temp = Hilfsvariable/100.0

Dann hast du in der float Nachkommastellen.

Hi

Wenn man den Rohwert des DS18B20 nimmt, sind Das 16tel Grad - kann man für die Anzeige von .print((float)messwert/16,2); entsprechend aufbereiten lassen.

MfG

Annehm: Es dreht sich hier um einen DS18B20 - man möge mich erleuchten, wenn nicht.

Ehrlich, durch deinen Sketch steigt man nicht durch.
Warum liest du den Sensor 2 mal aus, einmal in int und einmal in float.

Nimm einfach die letzte Anweisung:

Temp = sensors.getTempCByIndex(0);

und schreibe das auf dein Display. Da hast du alles, was du willst.

@skyfox es ist eigentlich als float eingetragen...
@HotSystems das ist nicht mein Problem, das broblem ist die Timer-Bibliothek und wie ich die rauskriege ohne das Programm kaputtzumachen, zudem zeigt er die einzelnen zahlen nur abwechselnd auf dem Display an.
Sorry, hätte ich vielleicht genauer formulieren müssen.

fromandtounknown:
Sorry, hätte ich vielleicht genauer formulieren müssen.

Genau so ist das.

Und was float und long betrifft, du nutzt beides, number als long.

Danke, die reduzierung der Variable hat warum auch immer die Blinkzeit verkürzt.
Aber die Timergeschichte ist mir immernoch im weg, und der Temperaturwert aktualisiert sich immer noch nicht selbstständig.

fromandtounknown:
Danke, die reduzierung der Variable hat warum auch immer die Blinkzeit verkürzt.
Aber die Timergeschichte ist mir immernoch im weg, und der Temperaturwert aktualisiert sich immer noch nicht selbstständig.

Dann erkläre doch mal verständlich, was du mit dem timer überhaupt erreichen möchtest.

Und mein Tipp, wenn jemand deinen Sketch lesen soll, dann musst du den verständlich kommentieren.
So kann man nicht erkennen, was da ablaufen soll.

Der sinn am ende soll sein, das auf dem LCD-Display am ende der aktuell gemessene temperaturwert stehen soll, mit halbwegs schneller aktualisierung und wenn möglich mit Kommazahl.
Der Timer war schon vorher da, aus dem beispielprogramm was ich für die LCD-anzeige verwendet habe.
ich weiß nur nicht, wie ich den rausbekomme, ohne das programm unbrauchbar zu machen. genauso wie die serielle schnittstelle, die war zwar am anfang ganz praktisch, brauche ich aber auch nicht mehr, kriege die aber nicht entfernt ohne das Programm zu ruinieren.

OK, wenn du die Serielle nicht brauchst, dann ist das doch kein großes Problem.

Mach eine Kopie der Datei, Kommentiere mit // alles raus was die Serielle betriftt und teste den Sketch.
Damit machst du erstmal nix kaputt.

Bei dem Timer bin ich mir aktuell nicht sicher, was der überhaupt machen soll.
Das ist leider bei dem unübersichtlichen Sketch schwer.
Erst Recht weil du ihn nicht kommentierst.

danach postest du den aktuellen Sketch.

Aktuell kann ich noch nicht erkennen, wozu der Timer überhaupt sein soll.

Poste mal einen Link auf die Seite, wo du den Sketch mit der Anzeige her hast.

Ich habe mal angefangen, das für dich etwas übersichtlicher zu gestalten.
Hier der Teil zum Messen der Temperatur in einer Funktion.
Die Anzeige kommt später auch in eine extra Funktion.

Die serielle kommt später wieder raus.

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 13

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
float Temp = 0;
unsigned int  resolution = 12;
unsigned long lastTempRequest = 0;
unsigned int  delayInMillis = 0;

void setup(void)
{
  // Start serial communication for debugging purposes
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
}

void loop(void) {

  Serial.print("Celsius temperature: ");
  readSensor();           // liest den Sensor               
  showTemp();             // zeigt die Temperatur auf dem Display
}

void readSensor(void)
{
  if (millis() - lastTempRequest >= delayInMillis) // waited long enough??
  {
    sensors.requestTemperatures();
    Temp = sensors.getTempCByIndex(0);

    delayInMillis = 1000 / (1 << (12 - resolution));
    lastTempRequest = millis();
  }
}

void showTemp(void)
{
  //hier komm die Anzeige der Teperatur rein
  Serial.print(Temp);
  Serial.print("\n");
    
}

Vielen Dank @Hotsystems, ich schau mal was ich damit anfangen kann ^^
Muss es dann noch irgendwie aufs display kriegen...
Hier der Link zu der Seite wo der Code für die LCD-Anzeige herkommt...

fromandtounknown:
Vielen Dank @Hotsystems, ich schau mal was ich damit anfangen kann ^^
Muss es dann noch irgendwie aufs display kriegen...
https://osoyoo.com/2017/08/08/arduino-lesson-4-digit-7-segment-led-display/#4.2
hier der link zu der Seite wo der Code für die LCD-Anzeige herkommt...

Das ist kein Link, sondern eine URL.
Die ist mobil schwer zu öffnen.

Ich versteh grad den untershcied zwischen Link und URL nicht, weil für mich sieht das auch nach nem link aus, aber ich hab noch den hier...
https://raw.githubusercontent.com/osoyoo/Osoyoo-development-kits/master/Osoyoo%20lessons%20for%20Arduino/four_digit_7_segment_dispaly_74hc595.zip
Hier liegt der Originalcode von der webseite als .zip
ansonsten befindet der sich auch 1:1 in meiner ersten nachricht, die einzigsten anpassungen da waren bei mir für die pins auf dem Board.

Die Url die Du einfügst, mit dem Symbol für “insert a link” bearbeiten.
Fertig.

Zwischenablage01.jpg

Danke ^^

Eine URL ist nur eine Adresse, einen Link kann man anklicken.
Wie das geht, wurde dir beschrieben.

Ich habe mir die Seite mal am PC angesehen und muss hier jetzt leider passen.
Diese Schaltung scheint eine Art "Eieruhr" zu sein, für die der Timer zuständig ist.
Da ich bisher noch keine 7Segment Anzeige mit Schieberegister aufgebaut habe, fehlt mir hier die Erfahrung. Diese Anzeige ist übrigens kein LCD sondern eine Led-Anzeige.

Evtl. meldet sich ja noch jemand, der dir den Sketch entsprechend anpasst.
Dieser braucht dann nur in den vorbereiteten Sketch von mir eingefügt werden.

Moin,

nach dem:

#define ONE_WIRE_BUS 13

bin ich skeptisch. Denn wenn man dem Link von Dir folgt, sieht man das Board. Und Achtung: Die LED, die am PIN13 hängt, ist da offensichtlich am dauerleuchten, wenn man sich das Bild auf der Website ansieht.
Das geht elektrisch nicht.

Versuch mal den Sensor an Pin11 anzustecken und definiere den Bus dahin.