Runtime counter

Arduino specifieke Software
Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 21 Aug 2022, 17:09

hallo Paul,

Als ik je goed begrijp zeg je, maak alle tijdeenheden gelijk dus bijv. allemaal uint16_t dan hebben ze allemaal 2 byte ruimte op de fram.
De fram heeft idd capaciteit genoeg ik gebruik nog geen kwart ervan.

Ik zou dan de format voor regel "void write16(uint16_t memaddr, uint16_t value) uint16_t" moeten gebruiken?
Maar ik blijf dan toch hangen op het stukje "uint16_t memaddr" hoe defineer ik dat adress?


Erik

Advertisement

Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 22 Aug 2022, 14:58

Ik heb wat geprobeert en na enig typewerk kreeg ik het werkend.
Ik heb het advies overgenomen om alle integers 16 bit te maken

Tot dusver doet het programma :
- Houdt de verlopen tijd bij (zolang er stroom op staat)
- Geeft dit juist weer op de display
- Schrijft de tijd weg op de fram
- Leest de tijd terug als de stroom er weer op komt

Te doen:
Reset van de tijd mogelijk maken
Print maken waar alle componenten op kunnen

De sketch te stroomlijnen in de richting van OOP en overbodige code verwijderen.

Hier de sketch tot nu toe
Code: Alles selecteren


/*
   Aanpassing code 08-2022
   Draaiuren teller voor diverse apparaten zoals 3D printer, Laser enz.
   Hardware voor deze setup is:
   - Arduino pro mini 5V.
   - 0,91 I2C Oled 128x32 display.
   - MB85RC256 fram breakoutboard.
   Nog toe te voegen reset knop functie om geheugen leeg te maken
*/

#include <Wire.h>                         // library for I2C communication
#include <U8g2lib.h>                    // library for SSD1306 Oled display
#include <FRAM.h>                       // library for I2C Fram

FRAM fram;                                  //roep claas Fram aan

uint16_t prSec, prMin, prHr;          // 16bit int for time

                                                    // Simpele teller voor klokfunctie
unsigned long previousMillis = 0;    //set de teller initieel op nul
const long interval = 1000;             //interval 1 sec (1000 milliseconds)

const int ledPin = LED_BUILTIN;         //gebruik interne led
int ledState = LOW;                           //uitgangspositie led uit

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE);  // Initieer Adafruit ESP8266/32u4/ARM Boards

#define countof(a) (sizeof(a) / sizeof(a[0]))   // gebruikt voor dispay tijd icm "printTime"


void setup()
{
  Wire.begin();                          // Initate / start I2C comms
  u8g2.begin();                          // Initiate / start the display
  u8g2.clearBuffer();                    // clear the internal memory
  u8g2.setFont(u8g2_font_crox4h_tf );    // choose a suitable font
  u8g2.drawStr(5, 20, "CFSolutions");    // write text to the internal memory
  u8g2.sendBuffer();                     // transfer internal memory to the display
  delay(2000);                           // Tijd voor tekst openings scherm display
  getTime();                             // Get the value from FRAM (call subfunction)
  pinMode(ledPin, OUTPUT);               // config led
}

void loop()
{
  unsigned long currentMillis = millis();           //de tijdteller werkt nauwkeuriger
  if (currentMillis - previousMillis >= interval)   //zorgt dat iedere sec telt
  {
    previousMillis = currentMillis;                 //verifeert een seconde verloop
     
                                                    // de klok voor de tijd weergave en data voor opslag
    if (prSec < 59)prSec++;                         //telt tot 60 sec
    else
    {
      prSec = 0;
      if (prMin < 59)prMin++;                       // telt tot 60 min
      else
      {
        prMin = 0;
        if (prHr < 0xFFFF)prHr++;                   // telt tot 16 bits op 1 staan
        else prHr = 0;
      }
    }
    previousMillis = currentMillis;                 // verifeert een seconde verloop
    printTime();                                    // Display the time (call subfuntion)
    writeTime(prHr, prMin, prSec);                  // Write to FRAM (call subfunction)
    digitalWrite(ledPin, ledState);                 // set the LED with the ledState of the variable:
                                                    // laat de led knipperen op de Pro Mini
    if (ledState == LOW)
    {
      ledState = HIGH;                              //led 1 sec aan
    }
    else
    {
      ledState = LOW;                               //led 1 sec uit
    }
  }
}

                                  // Converteert prXxx na hmXxx voor wegschrijven op fram
void writeTime(uint16_t hmHour, uint16_t hmMin, uint16_t hmSec)
{
  // de write format in de lib is:  write16(uint16_t memaddr, uint16_t value) of
  fram.write16(0,  hmSec);        //Mem adress = 0, value is HmSec
  fram.write16(2,  hmMin);        //Mem adress = 2, value is HmMin
  fram.write16(4,  hmHour);       //Mem adress = 4, value is HmHour       
 
}

 
void getTime()
{
  // de read format in de lib is:  read16(uint16_t memaddr)
  prSec = fram.read16(0 );          //lees Mem adress 0
  prMin = fram.read16(2 );         
  prHr  = fram.read16(4 );         
}

#define countof(a) (sizeof(a) / sizeof(a[0]))   // gebruikt voor dispay tijd icm "printTime"

void printTime()
{
  char hourmeterString[11];             // defineer lengte string
  snprintf_P(hourmeterString,           // maak de string op
             countof(hourmeterString),
             PSTR("%04u:%02u:%02u"),
             prHr,
             prMin,
             prSec );
  u8g2.clearBuffer();                   // clear the internal memory
  u8g2.setFont(u8g2_font_helvR18_tn );  // choose a suitable font
  u8g2.drawStr(5, 21, hourmeterString); // write the constructed time value to internal memory
  u8g2.sendBuffer();                    // transfer internal memory to the display
}

Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 25 Aug 2022, 09:38

Ik denk gelukt, alles werkt en de uitvoer is coorrect naar display en fram.
Volgende stap is alles op 1 print te plaatsen en te verwerken in 3D printer en Laser.
Dat resultaat zal ik op het forum zetten van : https://www.printables.com/

Hieronder de final sketch.
Als er suggesties zijn om de code nog verder te optimaliseren dan hoor ik die graag.

Code: Alles selecteren
/* CFSolutions remix of B-labz Runtime counter
   Created adapted code 08-2022.
   Now suitable for use with MB85RC256 I2C Fram breakout boards
   Uses the library from Rob Tillaart FRAM_I2C
   Runtime counter for 3D printer, Laser and or CNC devices, etc.
   Hardware used:
   - Arduino pro mini 5V.
   - 0,91 I2C Oled 128x32 display.
   - MB85RC256 Fram I2C comms.
   - Mini 360 Step down converter for 5V supply
   - Push button (optional) for reset funtion
   Libraries used:
   - https://github.com/RobTillaart/FRAM_I2C
   - https://github.com/olikraus/U8g2_Arduino
*/

#include <Wire.h>                         // library for I2C communication
#include <U8g2lib.h>                     // library for SSD1306 Oled display
#include <FRAM.h>                       // library for I2C Fram

FRAM fram;                                   // call claas Fram

// define memory adress for time data
#define Mem_Sec 0                       // locate byte for time address seconds
#define Mem_Min 2                       // locate byte for time address minutes
#define Mem_Hrs 4                       // locate byte for time address hours

uint16_t prSec, prMin, prHr;            // 16bit (2byte) int for time
uint8_t clearCtr;                             // 8bit for reset counter button funtion
#define CLEAR_PIN 9                     // Pin where the Clear switch is connected (use 10K Pull-down resistor)
const int ledPin = LED_BUILTIN;      // Use onboard led
int ledState = LOW;                       // Start situation led off

// Simple but accurate counter for clock
unsigned long previousMillis = 0;       // Set counter to zero
const long interval = 1000;               // Interval 1 sec (1000 milliseconds)

// Initiate Adafruit ESP8266/32u4/ARM Boards
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE);


void setup()
{
  Wire.begin();                                       // Initate / start I2C comms
  u8g2.begin();                                      // Initiate / start the display
  u8g2.clearBuffer();                              // Clear the internal memory
  u8g2.setFont(u8g2_font_crox4h_tf );    // Choose a suitable font
  u8g2.drawStr(5, 20, "CFSolutions");     // Write text to the internal memory
  u8g2.sendBuffer();                              // Transfer internal memory to the display
  delay(2000);                                       // Timedelay for opening text
  u8g2.clearBuffer();                              // Clear the internal memory
  u8g2.setFont(u8g2_font_crox4h_tf );    // Choose a suitable font
  u8g2.drawStr(5, 20, "ODO-Timer v2");   // Write text to the internal memory
  u8g2.sendBuffer();                              // Transfer internal memory to the display
  delay(2000);                                       // Timedelay for opening text

  getTime();                                         // Get the value from FRAM (call subfunction)
  pinMode(ledPin, OUTPUT);                   // Assign output to led
  pinMode(CLEAR_PIN, INPUT);             // Assign input to switch pin
}


void loop()
{
  unsigned long currentMillis = millis();           // The counter in millis
  if (currentMillis - previousMillis >= interval)   // Makes every second count
  {
    previousMillis = currentMillis;                 // Checked if second complete
    // Count the clock data
    if (prSec < 59)prSec++;                         // Till 60 sec
    else
    {
      prSec = 0;
      if (prMin < 59)prMin++;                       // Till 60 min
      else
      {
        prMin = 0;
        if (prHr < 9999)prHr++;                     // Till 9999 Hours
        else prHr = 0;
      }
    }
    previousMillis = currentMillis;                 // Verify a second past

    printTime();                                          // Display the time (call subfuntion)
    writeTime(prHr, prMin, prSec);                  // Write to FRAM (call subfunction)
    digitalWrite(ledPin, ledState);                 // Set the LED with the ledState of the variable:

    if (ledState == LOW)                            // Blink led on Pro Mini
    {
      ledState = HIGH;                              // Led 1 sec on
    }
    else
    {
      ledState = LOW;                               // Led 1 sec off
    }

    if (digitalRead(CLEAR_PIN) == 0)                //If the clear Switch is pressed and held for 3 seconds clear the values
    {
      if (clearCtr < 3) clearCtr++;
    }
    else clearCtr = 0;
    if (clearCtr == 3)
    {
      clearTime();
    }
  }
}


// Convert prXxx to hmXxx for writing to fram
void writeTime(uint16_t hmHour, uint16_t hmMin, uint16_t hmSec)
{
  // de write format in de lib is:  write16(uint16_t memaddr, uint16_t value)
  fram.write16(Mem_Sec,  hmSec);        //Mem adress = 0, value is HmSec
  fram.write16(Mem_Min,  hmMin);        //Mem adress = 2, value is HmMin
  fram.write16(Mem_Hrs,  hmHour);       //Mem adress = 4, value is HmHour
}


void getTime()
{
  // de read format in de lib is:  read16(uint16_t memaddr)
  prSec = fram.read16(Mem_Sec);          // Read Mem adress 0, 2, 4
  prMin = fram.read16(Mem_Min);
  prHr  = fram.read16(Mem_Hrs);
}


void clearTime()
{
  fram.write16(Mem_Sec,  0);            //Mem adress = 0, reset value to 0
  fram.write16(Mem_Min,  0);            //Mem adress = 2, reset value to 0
  fram.write16(Mem_Hrs,  0);            //Mem adress = 4, reset value to 0
  getTime();
}


void printTime()
{
 #define countof(a) (sizeof(a) / sizeof(a[0]))   // Used for dispay time icw "printTime"
  char hourmeterString[11];             // Define length of string
  snprintf_P(hourmeterString,           // Create string
             countof(hourmeterString),
             PSTR("%04u:%02u:%02u"),
             prHr,
             prMin,
             prSec );
  u8g2.clearBuffer();                               // Clear the internal memory
  u8g2.setFont(u8g2_font_helvR18_tn );  // Choose a suitable font
  u8g2.drawStr(5, 21, hourmeterString); // Write the constructed time value to internal memory
  u8g2.sendBuffer();                              // Transfer internal memory to the display
}

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 16 gasten