Runtime counter

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

Runtime counter

Berichtdoor Creator » 17 Jul 2022, 14:32

Laatst vond ik op het grote web een prima oplossing voor het bijhouden van draaiuren voor mijn 3D printer en Laser.
Deze maakt gebruik van een FRAM geheugen module die geen data verliest bij uitzetten en voor dit doeleinde een (on)beperkte levensduur heeft.
De setup maakt gebruik van een Arduino pro mini, een Fram (MB85RC256V chipset) breakout printje, een 0,91 inch oled schermpje en een mini 360 buck convertertje.
De hardware is heel simpel via I2C verbinding met elkaar verbonden en de mini 360 wordt gevoed door de 12V PSU van de printer en/of Laser.
Het Fram printje heeft al de weerstanden en condensator erop zitten dus 4 draadjes en klaar.

Code gedownload en............juist daar kwam het eerste obstakel, welke bibliotheek is gebruikt voor de Fram?
Inmiddels heb ik, denk ik, alle beschikbare fram bibliotheken wel binnen maar bij elke krijg ik foutmeldingen bij het compileren.
Zoals bij de bibliotheek:
Adafruit FRAM I2C (v.2.0.0) foutmelding 'FRAM'does not name a type (op regel FRAM fram(0b00); )
Fram (by industruino v.1.0.0) foutmelding 'FRAM'does not name a type (op regel FRAM fram(0b00); )
FRAM_I2C (by Rob Tillaart v. 0.4.0) foutmelding 'class FRAM has no member named 'WriteByte'; did you mean '_sizeBytes'?

Ik weet niet meer waar de fout te zoeken daarvoorschiet mijn kennis veel tekort.
Wie kan mij verder op weg helpen?

hieronder de sketch waar het om draait.

Code: Alles selecteren
/* Nederlands commentaar bijgewerkt jul 2022.
   Dit is een ODO urenteller voor bijv. 3D printer, CNC-machines, Lazers, enz.
   Het ontwerp is een stand alone asis welke gevoed wordt door een 6-24V voeding.
   De hardware gebruikt bestaat uit:
   - Mini 360 DC stepdown converter naar 5V
   - Arduino pro mini 5V 16Hz versie
   - 5V I2C FRAM breakout board 32Kb geheugen (MB85RC256V chipset)
   - 0,91 inch I2C Oled display 128x32
   Deze sketch is uitgekleed de functie voor de resetknop en keuze van SPI/I2C zijn verwijderd t.o.v. het origineel.

   Het origineel is te vinden op You-Tube onder "3D printer runtime counter"
   V 1.0. Created by B-Labz!
*/

//initieren variabelen en constanten
//<lib> bibliotheek staat in Arduino Library folder,"lib" bibliotheek staat in Sketch folder
#include <Wire.h>         //Library for I2C comms
//#include <Fram.h>         //Library for FRAM I2C memory control (is dit wel de juiste?)
#include "U8g2lib.h"      //Library for SSD1306 Oled display

//Locations in FRAM memory: Address
#define LOC_SEC 0
#define LOC_MIN 4
#define LOC_HRL 8
#define LOC_HRM 12

FRAM fram(0b00);            //hier gaat het compileren fout! Is dit een functie?
                            // FOUTMELDING 'FRAM'does not name a type
#define FRAM_PAGE 0

//Defineren klok tijden
unsigned int  prHr;
unsigned char prSec, prMin;
unsigned int  counter10Sec;
unsigned char clearCtr;

#define RUNONCE             //Zet eenmalig de timer op nul en kan daarna niet meer worden gereset

//Inisiate Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE);

//Einde initieren.

//function gets the hour meter values from FRAM location
void getHM();

// put your setup code here, to run once:
void setup() {
  Wire.begin();                             //Start I2C comms
  u8g2.begin();                             //Start display
  u8g2.clearBuffer();                       //clear the internal memory
  u8g2.setFont(u8g2_font_crox2h_tf );       //choose a suitable font
  u8g2.drawStr(5, 20, "B-Labz-Hour Meter!"); //write text to the internal memory
  u8g2.sendBuffer();                        //transfer internal memory to the display
  pinMode(LED_BUILTIN, OUTPUT);             //per seconde flash

  //If RUNONCE hash define is active it clears the values in memory location to zero
  //Add val, bytes
#ifdef RUNONCE
  fram.WriteByte(FRAM_PAGE, LOC_SEC, 0);
  fram.WriteByte(FRAM_PAGE, LOC_MIN, 0);
  fram.WriteByte(FRAM_PAGE, LOC_HRL, 0);
  fram.WriteByte(FRAM_PAGE, LOC_HRM, 0);
#endif
  delay(2000);
  getHM();         //Get the value from FRAM
  printTime();     //Display on Screen
}

//Main program continious loop
void loop() {
  // A simple clock implementation
  if (prSec < 59)prSec++;
  else
  {
    prSec = 0;
    if (prMin < 59)prMin++;
    else
    {
      prMin = 0;
      if (prHr < 0xFFFF)prHr++;
      else prHr = 0;
    }
  }

//write back the updated value into FRAM once every 1 sec and display the same
  if (counter10Sec < 1)counter10Sec++;
  else
  {
    counter10Sec = 0;
    writeHM(prHr, prMin, prSec);    //Write to FRAM
    printTime();                    //Display the time
  }

//Toggle builtin LED ~one sec once
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(250);
}

//This function writes the value into FRAM
void writeHM(unsigned int hmHour, unsigned char hmMin, unsigned char hmSec) {
  fram.WriteByte(FRAM_PAGE, LOC_SEC, hmSec);
  fram.WriteByte(FRAM_PAGE, LOC_MIN, hmMin);
  fram.WriteByte(FRAM_PAGE, LOC_HRL, hmHour & 0xff);
  fram.WriteByte(FRAM_PAGE, LOC_HRM, (hmHour & 0xff00) >> 8);
}

//This function gets value from FRAM.
//Hour variable is a 16 bit
void getHM() {
  prSec = fram.ReadByte(FRAM_PAGE, LOC_SEC);
  prMin = fram.ReadByte(FRAM_PAGE, LOC_MIN);
  prHr  = ((fram.ReadByte(FRAM_PAGE, LOC_HRM)) << 8 | (fram.ReadByte(FRAM_PAGE, LOC_HRL)));
}

//This functions builds string to move it to u8g2 on SSD1306
#define countof(a) (sizeof(a) / sizeof(a[0]))
void printTime() {
  char hourmeterString[20];
  snprintf_P(hourmeterString,
             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, 25, hourmeterString); // write the constructed time value to internal memory
  u8g2.sendBuffer();                   // transfer internal memory to the display
}

Advertisement

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

Re: Runtime counter

Berichtdoor shooter » 17 Jul 2022, 18:54

kijk eerst eens of de librarie fram wel geladen wordt, daarin staat danop de tweede foute regel wordt een versie van fram geladen kijk eens of je dat goed doet, en uiteraard moet je de // weghalen logisch he.
dan dan is het aand code van fram wat er verder moet gebeuren.
paul deelen
shooter@home.nl

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

Re: Runtime counter

Berichtdoor Creator » 19 Jul 2022, 15:46

Bedankt voor de reactie Paul,

Hoe zie ik of de library geladen is?
In 'Bibliotheek beheer' staat de library ver. 4.0.0 als installed, anders zou ik niet weten hoe ik het kan zien.

Ik heb ook de .cpp en .h lib bekeken maar ik kom nergens 'WriteByte" verwijzingen tegen.
Ik weet dan ook niet welke library in het origineel is gebruikt.
De autheur probeeer ik al een paar dagen te benaderen maar die geeft vooralsnog niet thuis.

Natuurlijk is // weggehaald uit de sketch ;)

Maar de compilerfout blijft maar komen.

Gebruikers-avatar
Berichten: 237
Geregistreerd: 22 Jan 2013, 16:40

Re: Runtime counter

Berichtdoor zuid » 20 Jul 2022, 08:38

//#include <Fram.h> //Library for FRAM I2C memory control (is dit wel de juiste?)


Moet dat niet zijn: #include <FRAM.h> //Library for FRAM I2C memory control ????

m.v.g. Nico

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

Re: Runtime counter

Berichtdoor Creator » 20 Jul 2022, 09:30

hoi Nico,

Ja voor de FRAM_I2C library is dat i.d.d. <FRAM.h> maar die geeft de foutmelding : 'class FRAM has no member named 'WriteByte'; did you mean '_sizeBytes'?
Gebruik ik de Fram library van industruino v.1.0.0 met < Fram.h> dan krij ik de foutmelding : 'FRAM'does not name a type (op regel FRAM fram(0b00);

Dus beide bibliotheken werken niet zoals verwacht en ik krijg mijn vinger er niet op waarom.

PS. de sketch is gemaakt in 2021 dus niet erg oud v.w.b. achterhaalde bilbliotheken.

Berichten: 62
Geregistreerd: 04 Sep 2021, 08:31

Re: Runtime counter

Berichtdoor RobGood » 20 Jul 2022, 11:52


Gebruikers-avatar
Berichten: 237
Geregistreerd: 22 Jan 2013, 16:40

Re: Runtime counter

Berichtdoor zuid » 20 Jul 2022, 13:29

Na wat zoekwerk heeft Google de volgende bibliotheek als optie gevonden: https://github.com/battosai30/FRAM
Misschien is dit de oplossing.
m.v.g. Nico


zo te zien was ik wat te laat

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

Re: Runtime counter

Berichtdoor Creator » 20 Jul 2022, 16:07

Rob, Nico,

Bedankt voor jullie reactie.
Inmiddels betreffende library geladen en .............. Het compileert zonder fouten.
De compiler geeft wel warnings mbt : warning: narrowing conversion of '(Data & 255)' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]
byte Data_Array[2]={Data & 0xFF, (Data>>8) & 0xFF};

Nu straks kijken of de 4k setting niet bijt met de 32k fram.
Ik hou jullie op de hoogte van het resultaat.

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

Re: Runtime counter

Berichtdoor Creator » 25 Jul 2022, 11:01

Update met de nieuwe library van battosai30.

Het compileren gaat..... in eerste instantie komt de compiler met een reeks warnings over het beschikbare geheugen, maar gaat wel door.
Als je later nog eens de sketch compileert dan blijven deze warnigs achterwege en laad de sketch zonder problem.

Bij het uitvoeren op de pro mini gaat het zoals verwacht. De spanning erop en na twee seconden begint de klok te lopen, tot zover geen problemen.
Echter spanning eraf en er dan weer op...... dan beginnen we weer bij nul, terwijl het de laatste (tijd) data de zou moeten ophalen van het fram geheugen.
Ik heb het vermoeden dat de data niet naar de fram wordt geschreven en/of wordt opgehaald.

Er is echter een example sketch van deze lib en daarin wordt staat:
FRAM fram(0b00); // i2c adress is determined by state of pins A2 and A1
// for example, if A2 = VCC and A1 = GND write : FRAM fram(0b10);
Maar bij mijn weten wordt I2C comms gevoerd over SDA en SCL en de voeding over Vcc en GND of ben ik nu....?

En op het FRAM breakout board heeft het over adress :1010+A2+A1+A0 default 0x50
Ik heb echter alle adressen geprobeerd met allen hetzelfde resultaat na opnieuw de spanning erop beginnen we op nul.

Uitvoer van dit example geeft op de seriele monitor het volgende resultaat: "niets, blanco"

Zit ik op een fout spoor?

Gebruikers-avatar
Berichten: 237
Geregistreerd: 22 Jan 2013, 16:40

Re: Runtime counter

Berichtdoor zuid » 26 Jul 2022, 06:50

Misschien is deze bibliotheek de oplossing:
https://github.com/sosandroid/FRAM_MB85RC_I2C
mvg Nico

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten