arduino i2c probleem

Op 30 augustus 2020 14:51:04 schreef SvenTech:
heb nu dit geschreven met de debounce functie:

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 = 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:

code:


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

Golden Member

c code:


if (minutevalue >= 59)
{
   minutevalue = 0; //max minuten begrenzen
}

Brengt je weer in de problemen. Maak hier ofwel

c code:


if (minutevalue > 59)
{
   minutevalue = 0; //max minuten begrenzen
}

of

c code:


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.

Van Lambiek wordt goede geuze gemaakt.

buckfast beekeeper zegt dat ik bij het volgende stukje code een int met een bolean gaat vergelijken. Waarom zou dit niet kunnen?

code:


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:

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

Golden Member

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.

c code:

timer.setCounter(hourvalue, minutevalue, secondsvalue, timer.COUNT_DOWN, onComplete); //instellen timer

Staat 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.

c code:


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
}
Van Lambiek wordt goede geuze gemaakt.

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:

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)

code:


//--------------(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 -----------//

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

code:

lcd.print("COUNTDOWN TIMER");

dit kunnen zetten

code:

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

code:

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

c 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);

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?

Meep! Meep!

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 regel

code:

lcd.print("COUNTDOWN TIMER");

dit kunnen zetten

code:

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

code:

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

c 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);

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:

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);

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:

code:



#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:

code:


  display.display();

toegevoegd onder het stukje:

code:


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 vrijdag 11 september 2020 17:10:02 (34%)

Met deze code laat hij dus wel alle tekst zien maar kan ik de tekst niet wijzigen:

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");
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

[Bericht gewijzigd door SvenTech op zondag 13 september 2020 19:12:51 (94%)

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

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:

c code:


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.

Meep! Meep!