Arduino Nano 7 Segment Serial RTC

Hi und Guten Tag,

Habe gerade Urlaub ( es regnet) und ich wage mich mal wieder an den Arduino.
Ich möchte bzw. bin dabei mir eine Uhr zubauen mit,

Nano V3
7 Segment Serial
TinyRTC
LM35 (2 Stück)

So an sich läuft die Uhr, auch schon so wie sie soll.
Aber nach dem eine Stunde vergangen ist, kommt nur noch Schrott auf dem Display.

Ich befürchte mal das irgendwie die Stellen verrutschen und daher das Problem entsteht.

→ Das Problem ist die Null die nicht auf taucht bei den Minuten von 1-9 ←

Der Code ist ein sammelsurium, von Sparkfun und “Internet” :slight_smile:

Wäre nett wenn mir einer ein paar ratschläge geben könnte.

#include <Wire.h>
#include "RTClib.h"
#include <SoftwareSerial.h>

// These are the Arduino pins required to create a software seiral
//  instance. We'll actually only use the TX pin.
const int softwareTx = 8;
const int softwareRx = 7;
SoftwareSerial s7s(softwareRx, softwareTx);
unsigned int counter = 0;  // This variable will count up to 65k
char tempString[10];  // Will be used with sprintf to create strings

RTC_DS1307 RTC;

const int buttonPin = 5;
int buttonState = 0;
const int analogInPin = A1;
int sensor = 0;
int val = 0;

const int ledPin =  13;

int LM35 = A0;
int LM352 = A2;
float SensorValue = 0;
float SensorValue2 = 0;
float temperatur = 0;
float temp[5];

void setup()
{
  // Must begin s7s software serial at the correct baud rate.
  //  The default of the s7s is 9600.
  s7s.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Wire.begin();
    RTC.begin();
   // RTC.adjust(DateTime("JUL 24 2014","18:11:11"));
  // Clear the display, and then turn on all segments and decimals
  clearDisplay();  // Clears display, resets cursor
 // s7s.print("----");  
// s7s.print("____");
 // delay(1500);
//  s7s.print("----");
//  delay(1500);
//  s7s.print("____");
//  delay(1500);
//  s7s.print("8888");
//  delay(1500);
//  setDecimals(0b111111);  

  // Flash brightness values at the beginning
 // setBrightness(160);  // Lowest brightness
 setDecimals(0b00000000);
  delay(1500);
 // setBrightness(255);  // High brightness
  //delay(1500);

  // Clear the display before jumping into loop
  clearDisplay();  
}

void loop()
{
  sensor = analogRead(analogInPin); 
  val = map(sensor, 0, 1023, 0, 255);
  buttonState = digitalRead(buttonPin);
  SensorValue = analogRead(LM35);
  SensorValue2 = analogRead(LM352);
  temp[1] = (5.0 * analogRead(LM35) * 100.0) / 1024;
  temp[2] = (5.0 * analogRead(LM352) * 100.0) / 1024;


temperatur = (temp[1]+temp[2])/2;

DateTime now = RTC.now();
if (buttonState == HIGH) {    
    setDecimals(0b00000000);
    sprintf(tempString, "%4d", temperatur);
    s7s.print(temperatur,0),s7s.write(0x7D),s7s.write("C");
 //   s7s.print(tempString); //s7s.write(0x7D),s7s.write("C");
   setDecimals(0b0100000); 
   delay(800);
  }
  else {
    
   setDecimals(0b00010000);  // Sets digit 3 decimal on
   s7s.print(now.hour());
   s7s.print(now.minute(),DEC);
   setBrightness(val);
   digitalWrite(ledPin, HIGH);
   delay(1000);  // This will make the display update at 10Hz.
   digitalWrite(ledPin, LOW);
}
}


void clearDisplay()
{
  s7s.write(0x76);  // Clear display command
}

void setBrightness(byte value)
{
  s7s.write(0x7A);  // Set brightness command byte
  //s7s.write(value);  // brightness data byte
  s7s.write(val);
}


void setDecimals(byte decimals)
{
  s7s.write(0x77);
  s7s.write(decimals);
}

Hat jetzt zwar nichts mit deinem Problem zu tun, aber ich würde bei Map nicht Null als kleinsten Wert nehmen, sondern 1 oder 5 (experimentell). Sonst ist bei völliger Dunkelheit auch das Display komplett aus :P War bei mir jedenfalls so. Eventuell mußt du bei Map auch den kleinsten u. den größten Wert tauschen, oder du tauscht halt Fotozelle und Widerstand vom Spannungsteiler gegeneinander. Nächster Punkt ist, das du die Betriebsspannung mal mit dem Multimeter messen solltest und dann in der Formel statt (dem Idealwert 5) den real gemessenen Wert einträgst. Es können mal eben auch 4,86V sein. Meist werden laut den IC-Datenblättern +/-0,25V ganz offiziell toleriert. ;)

Gruß Gerald

So ich habe nun einen anderen Code genommen, damit bekomme ich auch eine führende Null auf der 7 Segment Anzeige.

→ Uhrzeit 24H wird angezeigt
→ Button um sich die Temp Anzeigen zulassen
→ Poti für Anzeige Dimmen

#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <SoftwareSerial.h>

const int softwareTx = 8;
const int softwareRx = 7;
SoftwareSerial s7s(softwareRx, softwareTx);
char tempString[10];

const int buttonPin = 5;
int buttonState = 0;
const int analogInPin = A1;
int sensor = 0;
int val = 0;

const int ledPin =  13;

int LM35 = A0;
int LM352 = A2;
float SensorValue = 0;
float SensorValue2 = 0;
float temperatur = 0;
float temp[5];


void setup() {
  Serial.begin(9600);
  s7s.begin(9600);
  clearDisplay();
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  setDecimals(0b11111111);
  delay (800);
  setDecimals(0b00000000);
  delay(1500);
}

void loop() {
  tmElements_t tm;
  
  sensor = analogRead(analogInPin); 
  val = map(sensor, 0, 1023, 0, 255);
  buttonState = digitalRead(buttonPin);
  SensorValue = analogRead(LM35);
  SensorValue2 = analogRead(LM352);
  temp[1] = (5.0 * analogRead(LM35) * 100.0) / 1024;
  temp[2] = (5.0 * analogRead(LM352) * 100.0) / 1024;
  temperatur = (temp[1]+temp[2])/2-2;

  (RTC.read(tm));
   if (buttonState == HIGH) { 
     
    setDecimals(0b00000000);
    sprintf(tempString, "%4d", temperatur);
    s7s.print(temperatur,0),s7s.write(0x7D),s7s.write("C");
    setDecimals(0b00100000); 
  delay(800);
 }
  else {
    setDecimals(0b00010000);
    print2digits(tm.Hour);
    print2digits(tm.Minute);
    setBrightness(val);
  delay(1000);
 }
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
  s7s.print('0');
  }
  s7s.print(number);
}

void setDecimals(byte decimals)
{
  s7s.write(0x77);
  s7s.write(decimals);
}

void clearDisplay()
{
  s7s.write(0x76);  // Clear display command
}

void setBrightness(byte value)
{
  s7s.write(0x7A);  // Set brightness command byte
  //s7s.write(value);  // brightness data byte
  s7s.write(val);
}