LCD Clock loopt niet door (secondes)

algemene C code
Berichten: 12
Geregistreerd: 27 Dec 2016, 08:36

LCD Clock loopt niet door (secondes)

Berichtdoor mamekedi » 15 Jan 2017, 10:42

Hallo Allemaal,

Ik (newbie) ben bezig om via een lcd 16x2 een clock , temperature , humanity weer te geven
mijn probleem is dat de secondes niet mee lopen na het uploaden van de code.
ik denk zelf dat het probleem zit in de delay.
Op een gegeven moment loopt de clock ook achter.


Doel van het project.

1) Als eerste weer geven de tekst Mamekedi Projects.
2) De clock weer geven + secondes die doorlopen , op regel 2 van de lcd de datum
3) na een aantal seconden scherm leeg maken en de temperatuur en humanity laten zien.


Ik heb iets geprobeerd met millis maar kom er echt niet uit.
Wie van jullie specialisten kan mijn probleem oplossen :)
Zie ook bijlage


Hieronder mijn code:

Code: Alles selecteren

#include <dht.h>
#include <DS3231.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity

dht DHT;

#define DHT11_PIN 7
DS3231  rtc(SDA, SCL);
void setup()
{
rtc.begin(); // Initialize the rtc object

  // The following lines can be uncommented to set the date and time
  //  LET OP ALS JE DE TIJD INSTELD EN UPLOAD MOET JE DE // WEER TERUG ZETTEN EN WEER UPLOADEN !!!!
  //rtc.setDOW(SATURDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(16, 57, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(14, 1, 2017);   // Set the date to January 1st, 2014 D-M-Y
 
lcd.begin(16,2);
lcd.backlight();
lcd.setCursor(0, 0);        //First column, first row
lcd.print("    MaMeKeDi");
lcd.setCursor(0, 1);        //First column, second row
lcd.print("    Projects ");
//lcd.setCursor(12, 1);       //12th column, second row
//lcd.print("2");
//lcd.blink();                //start blinking cursor
delay (3000);               //delay 3 seconds
}
void loop()

{

  lcd.setCursor(0,0);
  lcd.print("Time:  ");
  lcd.print(rtc.getTimeStr());
  lcd.setCursor(0,1);
  lcd.print("Date: ");
  lcd.print(rtc.getDateStr());
  delay(8000);
  lcd.clear();
 
 
 
  int chk = DHT.read11(DHT11_PIN);
  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(DHT.temperature);
  lcd.print((char)223);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("Humidity: ");
  lcd.print(DHT.humidity);
  lcd.print("%");
  delay(8000);
  lcd.clear();

}





Groeten Marty
Bijlagen
IMG_0446.JPG
IMG_0446.JPG (80.79 KiB) 8914 keer bekeken
IMG_0447.JPG
IMG_0447.JPG (82.7 KiB) 8914 keer bekeken

Advertisement

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: LCD Clock loopt niet door (secondes)

Berichtdoor baco1978 » 15 Jan 2017, 14:40

Hallo mamekedi.

je hebt het zelf al aangegeven waar het probleem in zit

met delay geef je aan dat de arduino moet wachten.

door te werken met millis, zie het voorbeeld blink without delay.

als je dat combineert met je huidige programma, dan moet je al een stuk verder komen.
Met vriendelijke groet Arjan

Berichten: 12
Geregistreerd: 27 Dec 2016, 08:36

Re: LCD Clock loopt niet door (secondes)

Berichtdoor mamekedi » 15 Jan 2017, 15:22

baco1978 schreef:Hallo mamekedi.

je hebt het zelf al aangegeven waar het probleem in zit

met delay geef je aan dat de arduino moet wachten.

door te werken met millis, zie het voorbeeld blink without delay.

als je dat combineert met je huidige programma, dan moet je al een stuk verder komen.


Beste Arjan,

ik heb van alles geprobeerd ook in combinatie met de tutorial blink without delay.
het gaat me niet lukken heb je nog wat meer tips misschien.

Groeten Marty

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: LCD Clock loopt niet door (secondes)

Berichtdoor Koepel » 15 Jan 2017, 15:49

Kun je alles op het display zetten ? Of kun je een display met 4 regels nemen ?

plain code
..0123456789012345
.+----------------
0|'17 Jan 15 14:40
1| -18°C 81%


Wanneer je wilt wisselen tussen de tijd en de temperatuur en luchtvochtigheid, kun je dan aangeven hoe lang elk op het scherm moet staat ?

Je kunt een software timer maken met millis() van bijvoorbeeld 5 seconden. Na 5 seconden wisselt er geen led, maar een variabele. Die variabele geeft aan of de tijd of de temperatuur naar het scherm gaat.
Dat kan ook zonder millis, maar met millis() kun je daarna de sketch nog uitbreiden met andere dingen.

Een LCD scherm is langzaam. Je kunt bijvoorbeeld een tweede millis() gebruiken om een paar keer per seconde het display te updaten. Het eenvoudigste om mee te beginnen is een gewone delay van 1 seconde.

Kun je de Blink Without Delay gebruiken om iedere 5 seconden de led anders te zetten ? En dan voeg je bij die led een variabele toe. Kun je dat laten zien ? Dan krijg je dus een nieuwe kleine test-sketch om dat proberen. Het is normaal om voor een project een aantal kleine test-sketches te hebben.
Laatst gewijzigd door Koepel op 15 Jan 2017, 15:57, in totaal 1 keer gewijzigd.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: LCD Clock loopt niet door (secondes)

Berichtdoor shooter » 15 Jan 2017, 15:55

je hebt de loop al in 2 stukken staan.
maak van elk stuk een functie
zet de lcdclear bovenin de functie want dan is het scherm leeg als je er nieuw inzet.

in de loop komt een timer (zie inderdaad blink without delay)
als de timer gedaan is dan ddoe je dus een call afhankelijk van een vlag of naar de tijd of naar de temperatuur.
die vlag zet je elke keer om met vlag != vlag
uiteraard moeten de delays eruit.
paul deelen
shooter@home.nl

Berichten: 12
Geregistreerd: 27 Dec 2016, 08:36

Re: LCD Clock loopt niet door (secondes)

Berichtdoor mamekedi » 15 Jan 2017, 15:57

shooter schreef:je hebt de loop al in 2 stukken staan.
maak van elk stuk een functie
zet de lcdclear bovenin de functie want dan is het scherm leeg als je er nieuw inzet.

in de loop komt een timer (zie inderdaad blink without delay)
als de timer gedaan is dan ddoe je dus een call afhankelijk van een vlag of naar de tijd of naar de temperatuur.
die vlag zet je elke keer om met vlag != vlag
uiteraard moeten de delays eruit.


Sorry heren,

ik heb op dit moment echt geen idee wat ik fout doe
BLACKOUT .......

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: LCD Clock loopt niet door (secondes)

Berichtdoor Koepel » 15 Jan 2017, 16:01

Wij hebben graag dat je laat zien hoever je bent, zodat wij in de goede richting kunnen wijzen.

Kun je voor shooter de code in jouw loop in twee functies zetten ? of heb je nog niet eerder een functie gemaakt ?
Kun je voor mij de Blink Without Delay op 5 seconden zetten.
Als je beide sketches kunt laten zien, dan vlechten wij ze voor je in elkaar ;)

Berichten: 12
Geregistreerd: 27 Dec 2016, 08:36

Re: LCD Clock loopt niet door (secondes)

Berichtdoor mamekedi » 15 Jan 2017, 16:28

Koepel schreef:Wij hebben graag dat je laat zien hoever je bent, zodat wij in de goede richting kunnen wijzen.

Kun je voor shooter de code in jouw loop in twee functies zetten ? of heb je nog niet eerder een functie gemaakt ?
Kun je voor mij de Blink Without Delay op 5 seconden zetten.
Als je beide sketches kunt laten zien, dan vlechten wij ze voor je in elkaar ;)



Oke,

wat ik nu heb is het volgende (alleen werkt het nu niet meer ..... Oops)
het scherm knipperd nu , eerst komt de de tekst MaMeKeDi Projects van uit de void setup
daarna de tijd waarvan de secondes wel doorlopen maar er komt nu geen temperatuur en hum,
het scherm knipperd voortdurend.

hieronder de code: (sjee lijk simple maar toch :)

cpp code
#include <dht.h>
#include <DS3231.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity

dht DHT;

#define DHT11_PIN 7
DS3231 rtc(SDA, SCL);

unsigned long previousMillis = 0; // will store last time LED was updated
long SHOW_CLOCK = 5000; // milliseconds of on-time
long SHOW_TEMP = 5000; // milliseconds of off-time // interval at which to blink (milliseconds)

void setup()
{
rtc.begin(); // Initialize the rtc object

// The following lines can be uncommented to set the date and time
// LET OP ALS JE DE TIJD INSTELD EN UPLOAD MOET JE DE // WEER TERUG ZETTEN EN WEER UPLOADEN !!!!
//rtc.setDOW(SATURDAY); // Set Day-of-Week to SUNDAY
//rtc.setTime(16, 57, 0); // Set the time to 12:00:00 (24hr format)
//rtc.setDate(14, 1, 2017); // Set the date to January 1st, 2014 D-M-Y

lcd.begin(16,2);
lcd.backlight();
lcd.setCursor(0, 0); //First column, first row
lcd.print(" MaMeKeDi");
lcd.setCursor(0, 1); //First column, second row
lcd.print(" Projects ");
//lcd.setCursor(12, 1); //12th column, second row
//lcd.print("2");
//lcd.blink(); //start blinking cursor
delay (3000); //delay 3 seconds
}
void loop()

{

unsigned long currentMillis = millis();

if(currentMillis - previousMillis >= SHOW_CLOCK)
{
lcd.setCursor(0,0);
lcd.print("Time: ");
lcd.print(rtc.getTimeStr());
lcd.setCursor(0,1);
lcd.print("Date: ");
lcd.print(rtc.getDateStr());
lcd.clear();

}
else if (currentMillis - previousMillis >= SHOW_TEMP)
{

int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(DHT.temperature);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humidity: ");
lcd.print(DHT.humidity);
lcd.print("%");
lcd.clear();

}
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: LCD Clock loopt niet door (secondes)

Berichtdoor nicoverduin » 15 Jan 2017, 18:07

Kijk hier eens naar. Moet nog wel verder ingevuld worden. Timers binnen timers en omschakelen functionaliteit
cpp code
const int TEMP  		= 3000;		// 3 seconden Temperatuur tonen
const int TIJD = 8000; // 8 seconden Tijd tonen
const int UPDATE_MOMENT = 500; // elke halve seconde updaten display
uint32_t updateTimer; // update frequentie van het display
uint32_t timer; // omschakel moment timer
boolean keuzeTijd = true; // bepaalt of we de tijd of temp tonen
boolean eersteKeer = false; // is de eerste keer dat een update functie wordt aangeroepen
/**
* setup
*/
void setup() {
//
// start timer voor omschakel momenten
//
timer = millis();
keuzeTijd = true; // we beginnen met de tijd te tonen
eersteKeer = true; // forceer een eerste update straks
}
/**
* loop
*/
void loop () {
uint32_t huidigeTijd = millis();
//
// kijk of we tijd of temp aan het tonenen zijn
//
if (keuzeTijd) {
//
// ja dus kijk of de timer verlopen is
//
if (huidigeTijd - timer > TIJD) {
//
// timer is verlopen dus omschakelen naar temperatuur
//
keuzeTijd = false;
timer = huidigeTijd; // en start de timer voor temperatuur
eersteKeer = true; // voor de update is dit de eerste keer in een cyclus
}
} else {
//
// we zaten in temperatuur modus dus kijk of die verlopen
//
if (huidigeTijd - timer > TEMP) {
//
// genoeg getoont dus omschakelen weer naar tijd
//
keuzeTijd = true; // schakel om naar tid
timer = huidigeTijd; // en start de timer
eersteKeer = true; // voor de update is dit de eerste keer in een cyclus
}
}
ToonData();
}
/**
* toon data
*/
void ToonData(){
//
// kijk of dit de eerste keer is
//
uint32_t huidigeTijd = millis();
boolean update; // geeft aan of we echt moeten updaten

if (eersteKeer) {
update = true;
eersteKeer = false;
updateTimer = huidigeTijd; // start onze update timer
} else {
//
// dit is niet de eerste keer dus ff vergelijken met de update timer
//
if (huidigeTijd - updateTimer > UPDATE_MOMENT) {
//
// timer is verlopen dus update het display
//
update = true;
updateTimer = huidigeTijd; // restart de update timer
} else {
update = false; // nu ff niets doen
}
}
//
// afhankelijk van de keuze de juiste data tonen
//
if (update) {
if (keuzeTijd) {
//
// hier de code voor tonen tijd
//
} else {
//
// hier de code voor tonen temperatuur
//
}
}
}

Nog niet getest.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 12
Geregistreerd: 27 Dec 2016, 08:36

Re: LCD Clock loopt niet door (secondes)

Berichtdoor mamekedi » 15 Jan 2017, 18:47

nicoverduin schreef:Kijk hier eens naar. Moet nog wel verder ingevuld worden. Timers binnen timers en omschakelen functionaliteit
cpp code
const int TEMP  		= 3000;		// 3 seconden Temperatuur tonen
const int TIJD = 8000; // 8 seconden Tijd tonen
const int UPDATE_MOMENT = 500; // elke halve seconde updaten display
uint32_t updateTimer; // update frequentie van het display
uint32_t timer; // omschakel moment timer
boolean keuzeTijd = true; // bepaalt of we de tijd of temp tonen
boolean eersteKeer = false; // is de eerste keer dat een update functie wordt aangeroepen
/**
* setup
*/
void setup() {
//
// start timer voor omschakel momenten
//
timer = millis();
keuzeTijd = true; // we beginnen met de tijd te tonen
eersteKeer = true; // forceer een eerste update straks
}
/**
* loop
*/
void loop () {
uint32_t huidigeTijd = millis();
//
// kijk of we tijd of temp aan het tonenen zijn
//
if (keuzeTijd) {
//
// ja dus kijk of de timer verlopen is
//
if (huidigeTijd - timer > TIJD) {
//
// timer is verlopen dus omschakelen naar temperatuur
//
keuzeTijd = false;
timer = huidigeTijd; // en start de timer voor temperatuur
eersteKeer = true; // voor de update is dit de eerste keer in een cyclus
}
} else {
//
// we zaten in temperatuur modus dus kijk of die verlopen
//
if (huidigeTijd - timer > TEMP) {
//
// genoeg getoont dus omschakelen weer naar tijd
//
keuzeTijd = true; // schakel om naar tid
timer = huidigeTijd; // en start de timer
eersteKeer = true; // voor de update is dit de eerste keer in een cyclus
}
}
ToonData();
}
/**
* toon data
*/
void ToonData(){
//
// kijk of dit de eerste keer is
//
uint32_t huidigeTijd = millis();
boolean update; // geeft aan of we echt moeten updaten

if (eersteKeer) {
update = true;
eersteKeer = false;
updateTimer = huidigeTijd; // start onze update timer
} else {
//
// dit is niet de eerste keer dus ff vergelijken met de update timer
//
if (huidigeTijd - updateTimer > UPDATE_MOMENT) {
//
// timer is verlopen dus update het display
//
update = true;
updateTimer = huidigeTijd; // restart de update timer
} else {
update = false; // nu ff niets doen
}
}
//
// afhankelijk van de keuze de juiste data tonen
//
if (update) {
if (keuzeTijd) {
//
// hier de code voor tonen tijd
//
} else {
//
// hier de code voor tonen temperatuur
//
}
}
}

Nog niet getest.



Hoi Nico,

bijna goed
het probleem wat ik nu nog heb dat na het tonen van de tijd , de temperatuur wordt getoond
hier wordt in de eerste regel van de display temperatuur getoond Temp: 22.00 C ..... hierachter staat b.v. 22
die 22 zijn de secondes van het tonen van de tijd dat mag natuurlijk niet
ik dacht mmh dan zeg ik lcd.clear(); maar dat werkt helaas niet dan staat het scherm te knipperen waarschijnlijk omdat die in de loop zit.
Ik wil je alvast bedanken voor het mooie script, ik zal het nog wel goed door moeten nemen om alles te begrijpen, de ambitie is er.
zou je dit laatste probleempje nog voor me kunnen oplossen ?

Groeten Marty

hieronder mijn code:

cpp code
#include <dht.h>
#include <DS3231.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity

dht DHT;

#define DHT11_PIN 7
DS3231 rtc(SDA, SCL);

const int TEMP = 3000; // 3 seconden Temperatuur tonen
const int TIJD = 8000; // 8 seconden Tijd tonen
const int UPDATE_MOMENT = 500; // elke halve seconde updaten display
uint32_t updateTimer; // update frequentie van het display
uint32_t timer; // omschakel moment timer
boolean keuzeTijd = true; // bepaalt of we de tijd of temp tonen
boolean eersteKeer = false; // is de eerste keer dat een update functie wordt aangeroepen
/**
* setup
*/

void setup()
{

//
// start timer voor omschakel momenten
//
timer = millis();
keuzeTijd = true; // we beginnen met de tijd te tonen
eersteKeer = true; // forceer een eerste update strak


rtc.begin(); // Initialize the rtc object

// The following lines can be uncommented to set the date and time
// LET OP ALS JE DE TIJD INSTELD EN UPLOAD MOET JE DE // WEER TERUG ZETTEN EN WEER UPLOADEN !!!!
//rtc.setDOW(SATURDAY); // Set Day-of-Week to SUNDAY
//rtc.setTime(16, 57, 0); // Set the time to 12:00:00 (24hr format)
//rtc.setDate(14, 1, 2017); // Set the date to January 1st, 2014 D-M-Y

lcd.begin(16,2);
lcd.backlight();
lcd.setCursor(0, 0); //First column, first row
lcd.print(" MaMeKeDi");
lcd.setCursor(0, 1); //First column, second row
lcd.print(" Projects ");
//lcd.setCursor(12, 1); //12th column, second row
//lcd.print("2");
//lcd.blink(); //start blinking cursor
delay (3000); //delay 3 seconds
}
void loop () {

uint32_t huidigeTijd = millis();
//
// kijk of we tijd of temp aan het tonenen zijn
//
if (keuzeTijd) {
//
// ja dus kijk of de timer verlopen is
//
if (huidigeTijd - timer > TIJD) {
//
// timer is verlopen dus omschakelen naar temperatuur
//
keuzeTijd = false;
timer = huidigeTijd; // en start de timer voor temperatuur
eersteKeer = true; // voor de update is dit de eerste keer in een cyclus
}
} else {
//
// we zaten in temperatuur modus dus kijk of die verlopen
//
if (huidigeTijd - timer > TEMP) {
//
// genoeg getoont dus omschakelen weer naar tijd
//
keuzeTijd = true; // schakel om naar tid
timer = huidigeTijd; // en start de timer
eersteKeer = true; // voor de update is dit de eerste keer in een cyclus
}
}
ToonData();
}
/**
* toon data
*/
void ToonData(){
//
// kijk of dit de eerste keer is
//
uint32_t huidigeTijd = millis();
boolean update; // geeft aan of we echt moeten updaten

if (eersteKeer) {
update = true;
eersteKeer = false;
updateTimer = huidigeTijd; // start onze update timer
} else {
//
// dit is niet de eerste keer dus ff vergelijken met de update timer
//
if (huidigeTijd - updateTimer > UPDATE_MOMENT) {
//
// timer is verlopen dus update het display
//
update = true;
updateTimer = huidigeTijd; // restart de update timer
} else {
update = false; // nu ff niets doen
}
}
//
// afhankelijk van de keuze de juiste data tonen
//
if (update) {
if (keuzeTijd) {
//
// hier de code voor tonen tijd
lcd.setCursor(0,0);
lcd.print("Time: ");
lcd.print(rtc.getTimeStr());
lcd.setCursor(0,1);
lcd.print("Date: ");
lcd.print(rtc.getDateStr());

//
} else {
//
// hier de code voor tonen temperatuur

int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(DHT.temperature);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humidity: ");
lcd.print(DHT.humidity);
lcd.print("%");

//
}
}
}

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten