Op 30 augustus 2020 14:51:04 schreef SvenTech:
heb nu dit geschreven met de debounce functie:#include "Countimer.h" int btnhours = 2; //button voor instellen uren int btnminutes = 3; //button voor instellen minuten int btnseconds = 4; //button voor instellen secondes int btnstart = 5; //Start button int hourvalue = 1; //uren int minutevalue = 0; //minuten int secondsvalue = 0; //seconden int readinghours = 0; int readingminutes = 0; int readingseconds = 0; int readingstart = 0; int relaypin = 6; //Pin naar relais int btnstatehours; int btnstateminutes; int btnstateseconds; int btnstatestart; int lastbtnstatehours = LOW; int lastbtnstateminutes = LOW; int lastbtnstateseconds = LOW; int lastbtnstatestart = LOW; unsigned long lastDebouncehours = 0; unsigned long lastDebounceminutes = 0; unsigned long lastDebounceseconds = 0; unsigned long lastDebouncestart = 0; unsigned long debouncedelay = 50; #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); Countimer timer; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); pinMode(btnhours, INPUT); //ingang voor uren button pinMode(btnminutes, INPUT); //ingang voor minuten button pinMode(btnseconds, INPUT); //ingang voor seconden button pinMode(btnstart, INPUT); //ingang voor startbutton pinMode(relaypin, OUTPUT); //uitgang naar relais Serial.begin(9600); //begin serial monitor timer.setCounter(hourvalue, minutevalue, secondsvalue, timer.COUNT_DOWN, onComplete); //instellen timer // Print current time every 1s on serial port by calling method refreshClock(). timer.setInterval(refreshClock, 1000); } void refreshClock() { Serial.print("Current count time is: "); Serial.println(timer.getCurrentTime()); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor( 40, 20 ); display.print(timer.getCurrentTime()); display.display(); display.clearDisplay(); } void onComplete() { Serial.println("Complete!!!"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor( 40, 20 ); display.print("DONE"); display.display(); display.clearDisplay(); digitalWrite(relaypin, LOW); //hier zetten we de motor uit } void loop() { // Run timer readinghours = digitalRead(btnhours); readingminutes= digitalRead(btnminutes); readingseconds = digitalRead(btnseconds); readingstart = digitalRead(btnstart); timer.run(); if (readinghours != lastbtnstatehours) { // reset the debouncing timer //debounce voor de uren button lastDebouncehours = millis(); } if ((millis() - lastbtnstatehours) > debouncedelay) { if (readinghours != btnstatehours) { btnstatehours = readinghours; } } if (btnstatehours = HIGH) { (hourvalue++); } if (readingminutes != lastbtnstateminutes) { // reset the debouncing timer //debounce voor de minutes button lastDebounceminutes = millis(); } if ((millis() - lastbtnstateminutes) > debouncedelay) { if (readingminutes!= btnstateminutes) { btnstateminutes = readingminutes; } } if (btnstateminutes = HIGH) { (minutevalue++); } if (readingseconds != lastbtnstateseconds) { // reset the debouncing timer //debounce voor de seconds button lastDebounceseconds = millis(); } if ((millis() - lastbtnstateseconds) > debouncedelay) { if (readingseconds!= btnstateseconds) { btnstateseconds = readingseconds; } } if (btnstateseconds = HIGH) { (secondsvalue++); } if (hourvalue >= 99) { hourvalue = 0; //max uren begrenzen } if (minutevalue >= 59) { minutevalue = 0; //max minuten begrenzen } if (secondsvalue >= 59) { secondsvalue = 0; //max secondes begrenzen } if (readingstart != lastbtnstatestart) { // reset the debouncing timer //debounce voor de start button lastDebouncestart = millis(); } if ((millis() - lastbtnstatestart) > debouncedelay) { if (readingstart != btnstatestart) { btnstatestart = readingstart; } } if (readingstart = HIGH){ timer.start(); digitalWrite(relaypin, HIGH); //hier zetten we de motor aan } }
nu blijft de timer tellen terwijl poort 5 (btnstart) gewoon aan de nul hangt. Wat zou hiervoor de oorzaak kunnen zijn
Is al gezegd:
if (btnstateseconds = HIGH)
Is een assignement in een if statement. Je maakt btnstateseconds HIGH, en daarmee wordt de if dus altijd true.
Voor een compare moet je een dubbele == gebruiken.
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
if (minutevalue >= 59)
{
minutevalue = 0; //max minuten begrenzen
}
Brengt je weer in de problemen. Maak hier ofwel
if (minutevalue > 59)
{
minutevalue = 0; //max minuten begrenzen
}
of
if (minutevalue >= 60)
{
minutevalue = 0; //max minuten begrenzen
}
van.
In de huidige situatie kan je nooit 59 minuten krijgen. Waar ik voor de eerste optie zou gaan.
Je kijkt ook of de knoppen hoog zijn. Bij een µC is het heel vaak gemakkelijker om het omgekeerde te doen. Pull Up in de µC aan zetten en kijken of de knop LOW wordt.
buckfast beekeeper zegt dat ik bij het volgende stukje code een int met een bolean gaat vergelijken. Waarom zou dit niet kunnen?
if (readingA ==HIGH){
(A+1);
}
ik heb nu de volgende code geschreven, de timer werkt helaas nog niet, denk dat er toch iets misgaat met vergelijkingen en clr display.
code:
#include "Countimer.h"
int btnhours = 2; //button voor instellen uren
int btnminutes = 3; //button voor instellen minuten
int btnseconds = 4; //button voor instellen secondes
int btnstart = 5; //Start button
int hourvalue = 1; //uren
int minutevalue = 0; //minuten
int secondsvalue = 0; //seconden
int readinghours = 0;
int readingminutes = 0;
int readingseconds = 0;
int readingstart = 0;
int relaypin = 6; //Pin naar relais
int btnstatehours;
int btnstateminutes;
int btnstateseconds;
int btnstatestart;
int lastbtnstatehours = LOW;
int lastbtnstateminutes = LOW;
int lastbtnstateseconds = LOW;
int lastbtnstatestart = LOW;
unsigned long lastDebouncehours = 0;
unsigned long lastDebounceminutes = 0;
unsigned long lastDebounceseconds = 0;
unsigned long lastDebouncestart = 0;
unsigned long debouncedelay = 50;
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
Countimer timer;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
pinMode(btnhours, INPUT); //ingang voor uren button
pinMode(btnminutes, INPUT); //ingang voor minuten button
pinMode(btnseconds, INPUT); //ingang voor seconden button
pinMode(btnstart, INPUT); //ingang voor startbutton
pinMode(relaypin, OUTPUT); //uitgang naar relais
Serial.begin(9600); //begin serial monitor
timer.setCounter(hourvalue, minutevalue, secondsvalue, timer.COUNT_DOWN, onComplete); //instellen timer
// Print current time every 1s on serial port by calling method refreshClock().
timer.setInterval(refreshClock, 1000);
}
void refreshClock() {
Serial.print("Current count time is: ");
Serial.println(timer.getCurrentTime());
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor( 40, 20 );
display.print(timer.getCurrentTime());
display.display();
display.clearDisplay();
}
void onComplete() {
Serial.println("Complete!!!");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor( 40, 20 );
display.print("DONE");
display.display();
display.clearDisplay();
digitalWrite(relaypin, LOW); //hier zetten we de motor uit
}
void loop() {
// Run timer
readinghours = digitalRead(btnhours);
readingminutes= digitalRead(btnminutes);
readingseconds = digitalRead(btnseconds);
readingstart = digitalRead(btnstart);
timer.run();
if (readinghours != lastbtnstatehours) {
// reset the debouncing timer //debounce voor de uren button
lastDebouncehours = millis();
}
if ((millis() - lastbtnstatehours) > debouncedelay) {
if (readinghours != btnstatehours) {
btnstatehours = readinghours;
}
}
if (btnstatehours == LOW)
{
(hourvalue++);
}
if (readingminutes != lastbtnstateminutes) {
// reset the debouncing timer //debounce voor de minutes button
lastDebounceminutes = millis();
}
if ((millis() - lastbtnstateminutes) > debouncedelay) {
if (readingminutes!= btnstateminutes) {
btnstateminutes = readingminutes;
}
}
if (btnstateminutes == LOW)
{
(minutevalue++);
}
if (readingseconds != lastbtnstateseconds) {
// reset the debouncing timer //debounce voor de seconds button
lastDebounceseconds = millis();
}
if ((millis() - lastbtnstateseconds) > debouncedelay) {
if (readingseconds!= btnstateseconds) {
btnstateseconds = readingseconds;
}
}
if (btnstateseconds == LOW)
{
(secondsvalue++);
}
if (hourvalue > 99)
{
hourvalue = 0; //max uren begrenzen
}
if (minutevalue > 59)
{
minutevalue = 0; //max minuten begrenzen
}
if (secondsvalue > 59)
{
secondsvalue = 0; //max secondes begrenzen
}
if (readingstart != lastbtnstatestart) {
// reset the debouncing timer //debounce voor de start button
lastDebouncestart = millis();
}
if ((millis() - lastbtnstatestart) > debouncedelay) {
if (readingstart != btnstatestart) {
btnstatestart = readingstart;
}
}
if (readingstart == LOW){
timer.start();
digitalWrite(relaypin, HIGH); //hier zetten we de motor aan
}
}
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
Op 30 augustus 2020 14:47:59 schreef buckfast_beekeeper:
[...]clearDisplay aan het begin van de void. Ik vraag me ook af of je telkens de kleur en de grootte moet instellen. Is die niet blijvend tot je ze ergens wijzigt?
[...]
Waarom een int met een boolean vergelijken en niet 2 boolean gebruiken?
Of een vergelijking wordt uitgevoerd is gemakkelijk te detecteren. Een Serial.print met een bepaalde boodschap er in.
timer.setCounter(hourvalue, minutevalue, secondsvalue, timer.COUNT_DOWN, onComplete); //instellen timerStaat wel in je setup maar gebruik je nergens meer in je loop. Je gaat met een boolean moeten bijhouden of de tijd is gewijzigd en dan ga je die moeten wegschrijven. Werd al eens op gewezen.
boolean flgGewijzigd = false;
if (btnstateseconds == LOW){
secondsvalue++; // de () zijn hier niet nodig
flgGewijzigd = true;
}
if (flgGewijzigd){
timer.setCounter(hourvalue, minutevalue, secondsvalue, timer.COUNT_DOWN, onComplete); //instellen timer
}
Voor de late avond heb ik nog een vraagje: Heb een mooie link gevonden met daarin precies wat ik nodig heb: https://electronics-project-hub.com/arduino-countdown-timer-with-lcd-a….
Maaarrr, nu heb ik een i2c oled display (128x32). Deze heb ik nu aangesloten op de arduino met de code iets veranderd.(andere libary, SPI, WIRE). Maar nu geeft helaas mijn oled display nog geen beeld.
Weet iemand onder de programmeurs waar de fout ligt?
Dit is mijn aangepaste code:
#include <SPI.h>
#include <Wire.h>
#include<EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const int stsp = A0;
const int inc = A1;
const int dec = A2;
const int set = A3;
const int Led = 9;
const int relay = 8; //relaypin
int hrs = 0;
int Min = 0;
int sec = 0;
unsigned int check_val = 50;
int add_chk = 0;
int add_hrs = 1;
int add_min = 2;
bool RUN = true;
bool min_flag = true;
bool hrs_flag = true;
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("ELECTRONIC");
display.setCursor(0, 10);
display.print("COUNTDOWN TIMER");
pinMode(stsp, INPUT_PULLUP);
pinMode(inc, INPUT_PULLUP);
pinMode(dec, INPUT_PULLUP);
pinMode(set, INPUT_PULLUP);
pinMode(Led, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW);
digitalWrite(Led, LOW);
if (EEPROM.read(add_chk) != check_val)
{
EEPROM.write(add_chk, check_val);
EEPROM.write(add_hrs, 0);
EEPROM.write(add_min, 1);
}
else
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
}
delay(1500);
INIT();
}
void loop()
{
if (digitalRead(stsp) == LOW)
{
display.clearDisplay();
delay(250);
RUN = true;
while (RUN)
{
if (digitalRead(stsp) == LOW)
{
delay(1000);
if (digitalRead(stsp) == LOW)
{
digitalWrite(relay, LOW);
display.clearDisplay();
display.setCursor(0, 0);
display.println(" TIMER STOPPED");
display.setCursor(0, 10);
display.println("----------------");
delay(2000);
RUN = false;
INIT();
break;
}
}
digitalWrite(relay, HIGH);
sec = sec - 1;
delay(1000);
if (sec == -1)
{
sec = 59;
Min = Min - 1;
}
if (Min == -1)
{
Min = 59;
hrs = hrs - 1;
}
if (hrs == -1) hrs = 0;
display.setCursor(0, 10);
display.println("****************");
display.setCursor(4, 0);
if (hrs <= 9)
{
display.println('0');
}
display.print(hrs);
display.println(':');
if (Min <= 9)
{
display.println('0');
}
display.print(Min);
display.println(':');
if (sec <= 9)
{
display.println('0');
}
display.print(sec);
if (hrs == 0 && Min == 0 && sec == 0)
{
digitalWrite(relay, LOW);
display.setCursor(4, 0);
RUN = false;
for (int i = 0; i < 20; i++)
{
digitalWrite(Led, HIGH);
delay(100);
digitalWrite(Led, LOW);
delay(100);
}
INIT();
}
}
}
if (digitalRead(set) == LOW)
{
delay(500);
while (min_flag)
{
display.clearDisplay();
display.setCursor(0, 0);
display.println("SET MINUTE: ");
display.print(Min);
delay(100);
if (digitalRead(inc) == LOW)
{
Min = Min + 1;
if (Min >= 60) Min = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
Min = Min - 1;
if (Min <= -1) Min = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
min_flag = false;
delay(250);
}
}
while (hrs_flag)
{
display.clearDisplay();
display.setCursor(0, 0);
display.println("SET HOUR: ");
display.print(hrs);
delay(100);
if (digitalRead(inc) == LOW)
{
hrs = hrs + 1;
if (hrs > 23) hrs = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
hrs = hrs - 1;
if (hrs <= -1) hrs = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
hrs_flag = false;
delay(250);
}
}
if (hrs == 0 && Min == 0)
{
display.clearDisplay();
display.setCursor(0, 0);
display.println(" INVALID TIME");
delay(2000);
}
else
{
EEPROM.write(add_hrs, hrs);
EEPROM.write(add_min, Min);
}
INIT();
}
}
void INIT()
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
sec = 0;
display.clearDisplay();
display.setCursor(0, 0);
display.println("Start / Set Time");
display.setCursor(4, 10);
if (hrs <= 9)
{
display.println('0');
}
display.print(hrs);
display.println(':');
if (Min <= 9)
{
display.println('0');
}
display.print(Min);
display.println(':');
if (sec <= 9)
{
display.println('0');
}
display.print(sec);
min_flag = true;
hrs_flag = true;
delay(500);
}
en dit is de code die ik van internet af heb geplukt(om verschil te zien)
//--------------(c) Electronics project hub -----------//
#include <LiquidCrystal.h>
#include<EEPROM.h>
const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int stsp = A0;
const int inc = A1;
const int dec = A2;
const int set = A3;
const int buzz = 9;
const int relay = 8;
int hrs = 0;
int Min = 0;
int sec = 0;
unsigned int check_val = 50;
int add_chk = 0;
int add_hrs = 1;
int add_min = 2;
bool RUN = true;
bool min_flag = true;
bool hrs_flag = true;
void setup()
{
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ELECTRONIC");
lcd.setCursor(0, 1);
lcd.print("COUNTDOWN TIMER");
pinMode(stsp, INPUT_PULLUP);
pinMode(inc, INPUT_PULLUP);
pinMode(dec, INPUT_PULLUP);
pinMode(set, INPUT_PULLUP);
pinMode(buzz, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW);
digitalWrite(buzz, LOW);
if (EEPROM.read(add_chk) != check_val)
{
EEPROM.write(add_chk, check_val);
EEPROM.write(add_hrs, 0);
EEPROM.write(add_min, 1);
}
else
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
}
delay(1500);
INIT();
}
void loop()
{
if (digitalRead(stsp) == LOW)
{
lcd.clear();
delay(250);
RUN = true;
while (RUN)
{
if (digitalRead(stsp) == LOW)
{
delay(1000);
if (digitalRead(stsp) == LOW)
{
digitalWrite(relay, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIMER STOPPED");
lcd.setCursor(0, 1);
lcd.print("----------------");
delay(2000);
RUN = false;
INIT();
break;
}
}
digitalWrite(relay, HIGH);
sec = sec - 1;
delay(1000);
if (sec == -1)
{
sec = 59;
Min = Min - 1;
}
if (Min == -1)
{
Min = 59;
hrs = hrs - 1;
}
if (hrs == -1) hrs = 0;
lcd.setCursor(0, 1);
lcd.print("****************");
lcd.setCursor(4, 0);
if (hrs <= 9)
{
lcd.print('0');
}
lcd.print(hrs);
lcd.print(':');
if (Min <= 9)
{
lcd.print('0');
}
lcd.print(Min);
lcd.print(':');
if (sec <= 9)
{
lcd.print('0');
}
lcd.print(sec);
if (hrs == 0 && Min == 0 && sec == 0)
{
digitalWrite(relay, LOW);
lcd.setCursor(4, 0);
RUN = false;
for (int i = 0; i < 20; i++)
{
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
}
INIT();
}
}
}
if (digitalRead(set) == LOW)
{
delay(500);
while (min_flag)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SET MINUTE: ");
lcd.print(Min);
delay(100);
if (digitalRead(inc) == LOW)
{
Min = Min + 1;
if (Min >= 60) Min = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
Min = Min - 1;
if (Min <= -1) Min = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
min_flag = false;
delay(250);
}
}
while (hrs_flag)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SET HOUR: ");
lcd.print(hrs);
delay(100);
if (digitalRead(inc) == LOW)
{
hrs = hrs + 1;
if (hrs > 23) hrs = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
hrs = hrs - 1;
if (hrs <= -1) hrs = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
hrs_flag = false;
delay(250);
}
}
if (hrs == 0 && Min == 0)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" INVAID TIME");
delay(2000);
}
else
{
EEPROM.write(add_hrs, hrs);
EEPROM.write(add_min, Min);
}
INIT();
}
}
void INIT()
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
sec = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Start / Set Time");
lcd.setCursor(4, 1);
if (hrs <= 9)
{
lcd.print('0');
}
lcd.print(hrs);
lcd.print(':');
if (Min <= 9)
{
lcd.print('0');
}
lcd.print(Min);
lcd.print(':');
if (sec <= 9)
{
lcd.print('0');
}
lcd.print(sec);
min_flag = true;
hrs_flag = true;
delay(500);
}
//--------------(c) Electronics project hub -----------//
roadrunner84
Meep! Meep!
Als er een peripheral (zoals je display) niet werkt, is het handig om je probleem te isoleren. In jouw geval zou je onder de regel
lcd.print("COUNTDOWN TIMER");dit kunnen zetten
while(1);Je programma zal daar dus oneindig blijven hangen. Voordeel is dat het hele EEPROM gebeuren en de loop() niet gebruikt worden, maar de tekst "ELECTRONIC COUNTDOWN TIMER" zou wel op het scherm moeten komen. Er zijn dan dus nog minder dan 10 regels code over waar je probleem kan zitten.
Naast de regels die met "lcd." of "display." beginnen bovenaan in setup(), is er nog één andere regel die van belang is om te bestuderen op correctheid
Adafruit_SSD1306 display(OLED_RESET);Feitelijk zou je dus je code kunnen reduceren tot dit, en dan daarin je probleem zoeken en oplossen. Daarna kan je weer verder met wat je daaruit geleerd hebt
#include <SPI.h>
#include <Wire.h>
#include<EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("ELECTRONIC");
}
void loop()
{
}
Probeer ook de includes te reduceren zover mogelijk. Bijvoorbeeld de EEPROM heb je niet nodig, maar hoe zit het met Wire, GFX, en SPI?
Op 11 september 2020 09:41:33 schreef roadrunner84:
Als er een peripheral (zoals je display) niet werkt, is het handig om je probleem te isoleren. In jouw geval zou je onder de regellcd.print("COUNTDOWN TIMER");dit kunnen zetten
while(1);Je programma zal daar dus oneindig blijven hangen. Voordeel is dat het hele EEPROM gebeuren en de loop() niet gebruikt worden, maar de tekst "ELECTRONIC COUNTDOWN TIMER" zou wel op het scherm moeten komen. Er zijn dan dus nog minder dan 10 regels code over waar je probleem kan zitten.
Naast de regels die met "lcd." of "display." beginnen bovenaan in setup(), is er nog één andere regel die van belang is om te bestuderen op correctheidAdafruit_SSD1306 display(OLED_RESET);Feitelijk zou je dus je code kunnen reduceren tot dit, en dan daarin je probleem zoeken en oplossen. Daarna kan je weer verder met wat je daaruit geleerd hebt
#include <SPI.h> #include <Wire.h> #include<EEPROM.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.print("ELECTRONIC"); } void loop() { }Probeer ook de includes te reduceren zover mogelijk. Bijvoorbeeld de EEPROM heb je niet nodig, maar hoe zit het met Wire, GFX, en SPI?
bedankt voor uw reactie, ik heb de volgende code van u getest, deze werkt helaas niet:
#include <SPI.h>
#include <Wire.h>
#include<EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
}
display.setCursor(0, 0);
display.print("ELECTRONIC");
}
void loop()
{
}
maar nu heb ik een code die wel werkt, nu staat display text en display white wel in de loop. Ook zonder display.display() werkt het display niet. Wat is de functie van displaydisPLAY()?
En hoe kan ik de code van de counter laten werken met deze informatie?
code die wel werkt:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
}
void loop()
{
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Test");
display.display();
}
heb nu het volgende stukje code:
display.display();
toegevoegd onder het stukje:
display.print("COUNTDOWN TIMER");
nu zie ik wel electronic countdown timer op mijn display verschijnen. Het is dus de functie display display die niet was toegevoegd. Zou ik gewoon de while nu kunnen weghalen en display display aan het einde van de setup en de loop kunnen zetten?
Update: Heb een display.display gezet aan het einde van de setup. Dit heb ik ook gedaan in de loop en de functie INIT. Nu heb ik wel een goede weergave van het display. (ook alle println naar print veranderd).
Nu heb ik als enigste probleem dat ik geen update zie van het scherm wanneer ik bijvoorbeeld een decimaal increase met een button (of bijvoorbeeld een startbutton indruk). Weet iemand hoe ik dit kan oplossen?
groeten Sven
[Bericht gewijzigd door SvenTech op (34%)]
Met deze code laat hij dus wel alle tekst zien maar kan ik de tekst niet wijzigen:
#include <SPI.h>
#include <Wire.h>
#include<EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const int stsp = A0;
const int inc = A1;
const int dec = A2;
const int set = A3;
const int Led = 9;
const int relay = 8; //relaypin
int hrs = 0;
int Min = 0;
int sec = 0;
unsigned int check_val = 50;
int add_chk = 0;
int add_hrs = 1;
int add_min = 2;
bool RUN = true;
bool min_flag = true;
bool hrs_flag = true;
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("ELECTRONIC");
display.setCursor(0, 10);
display.print("COUNTDOWN TIMER");
display.display();
pinMode(stsp, INPUT_PULLUP);
pinMode(inc, INPUT_PULLUP);
pinMode(dec, INPUT_PULLUP);
pinMode(set, INPUT_PULLUP);
pinMode(Led, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW);
digitalWrite(Led, LOW);
if (EEPROM.read(add_chk) != check_val)
{
EEPROM.write(add_chk, check_val);
EEPROM.write(add_hrs, 0);
EEPROM.write(add_min, 1);
}
else
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
}
delay(1500);
INIT();
}
void loop()
{
if (digitalRead(stsp) == LOW)
{
display.clearDisplay();
delay(250);
RUN = true;
while (RUN)
{
if (digitalRead(stsp) == LOW)
{
delay(1000);
if (digitalRead(stsp) == LOW)
{
digitalWrite(relay, LOW);
display.clearDisplay();
display.setCursor(0, 0);
display.print("TIMER STOPPED");
display.setCursor(0, 10);
display.print("----------------");
delay(2000);
RUN = false;
INIT();
break;
}
}
digitalWrite(relay, HIGH);
sec = sec - 1;
delay(1000);
if (sec == -1)
{
sec = 59;
Min = Min - 1;
}
if (Min == -1)
{
Min = 59;
hrs = hrs - 1;
}
if (hrs == -1) hrs = 0;
display.setCursor(0, 10);
display.print("****************");
display.setCursor(0, 10);
if (hrs <= 9)
{
display.print('0');
}
display.print(hrs);
display.print(':');
if (Min <= 9)
{
display.print('0');
}
display.print(Min);
display.print(':');
if (sec <= 9)
{
display.print('0');
}
display.print(sec);
if (hrs == 0 && Min == 0 && sec == 0)
{
digitalWrite(relay, LOW);
display.setCursor(0, 10);
RUN = false;
for (int i = 0; i < 20; i++)
{
digitalWrite(Led, HIGH);
delay(100);
digitalWrite(Led, LOW);
delay(100);
}
INIT();
}
}
}
if (digitalRead(set) == LOW)
{
delay(500);
while (min_flag)
{
display.clearDisplay();
display.setCursor(0, 0);
display.print("SET MINUTE: ");
display.print(Min);
delay(100);
if (digitalRead(inc) == LOW)
{
Min = Min + 1;
if (Min >= 60) Min = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
Min = Min - 1;
if (Min <= -1) Min = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
min_flag = false;
delay(250);
}
}
while (hrs_flag)
{
display.clearDisplay();
display.setCursor(0, 0);
display.print("SET HOUR: ");
display.print(hrs);
delay(100);
if (digitalRead(inc) == LOW)
{
hrs = hrs + 1;
if (hrs > 23) hrs = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
hrs = hrs - 1;
if (hrs <= -1) hrs = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
hrs_flag = false;
delay(250);
}
}
if (hrs == 0 && Min == 0)
{
display.clearDisplay();
display.setCursor(0, 0);
display.print("INVALID TIME");
delay(2000);
}
else
{
EEPROM.write(add_hrs, hrs);
EEPROM.write(add_min, Min);
}
INIT();
}
display.display();
}
void INIT()
{
display.clearDisplay();
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
sec = 0;
display.clearDisplay();
display.setCursor(0, 0);
display.print("Start / Set Time");
display.setCursor(0, 10);
if (hrs <= 9)
{
display.print('0');
}
display.print(hrs);
display.print(':');
if (Min <= 9)
{
display.print('0');
}
display.print(Min);
display.print(':');
if (sec <= 9)
{
display.print('0');
}
display.print(sec);
min_flag = true;
hrs_flag = true;
delay(500);
display.display();
}
Probleem helaas nog steeds niet kunnen vinden. Ik denk wel dat de functie display.display ergens moet worden ingevoegd wil het gaan werken. Weet iemand waar ik dit het beste kan neerzetten?
Ik zie jullie reacties met belangstelling tegemoet.
Met vriendelijke groeten,
Sven
roadrunner84
Meep! Meep!
Het lijkt er dus op dat de display.display() functie het "geprepareerde" beeld overzet van het geheugen op het scherm.
Als je zelgt dat je het beeld niet kan wijzigen, wat bedoel je daar dan mee? Is er geheel geen verschil tussen beelden, of blijft de oude tekst staan terwijl je nieuwe tekst wilt weergeven?
Kijk even mee naar deze loop() functie, het is dezelfde als jij hebt, maar met wat code eruit gehaald voor de leesbaarheid:
void loop()
{
if (digitalRead(stsp) == LOW)
{
display.clearDisplay();
delay(250);
RUN = true;
while (RUN)
{
// veel code hier
}
}
// hier nog een hoop code
display.display();
}
Zie je het probleem? je display() functie wordt buiten je while(RUN) aangeroepen. Probeer het stuk code te isoleren dat een beeld prepareert en slechts direct daarna moet de display() functie aangeroepen worden, zo minimaliseer je de (in tijd gezien dure) schrijfacties naar het scherm die toch het beoogde resultaat creeëren.