Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Arduino specifieke Software
Berichten: 10
Geregistreerd: 26 Apr 2015, 19:22

Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Berichtdoor Otto » 17 Jan 2018, 10:20

voor het aansturen van een solar tracker (zie andere vraag uit 2016) ben ik nu een besturing aan het maken met een Nano v3.0 en een Nokia 5110. Nu is dat met een UNO en een 20x4 display.
(die UNO draait overigens al bijna 2 jaar lang continue zonder problemen 24 uur per dag 7 dagen in de week. Als ik verstandig zou zijn bleef ik overal af....)

voor de nokia gebruik ik de u8g2 lib, en momenteel daarvan slechts 1 lettertype op 5 regels info, geen lijnen of andere franje.
na het verifieren van de schets krijg ik de melding:

De schets gebruikt 18288 bytes (59%) programma-opslagruimte. Maximum is 30720 bytes.
Globale variabelen gebruiken 1648 bytes (80%) van het dynamisch geheugen. Resteren 400 bytes voor lokale variabelen. Maximum is 2048 bytes.
Weinig geheugen beschikbaar, er kunnen zich stabiliteitsproblemen voordoen

als ik wat ga spelen met het programma en steeds verifieer, blijkt dat de declaratieregel:

U8G2_PCD8544_84X48_F_4W_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 9, 12); // Declaratie LCD Display uit de U8G2 library

15% aan het geheugenruimte toevoegd.

Ook heb ik geconstateerd dat als ik een tweede lettertype gebruik de programmaruimte meteen voor 92% gebruikt is!!

Vraag:
Kan ik de U8g2 lib "slimmer" gebruiken, zodat het minder geheugen beslaat??
is er een NOKIA 5110 lib die minder geheugen beslaat??
of kan ik beter terug naar de 20x4 LCD??
of maak ik het programma te "mooi" en te uitgebreid met te veel variabelen??

Advertisement

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

Re: Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Berichtdoor nicoverduin » 17 Jan 2018, 12:38

Geen idee of jij voldoende kennis hebt om het slimmer te maken. Wel kunnen we aangeven in de sketch waar er nog eea winst te behalen valt. Moet je hem ff hier neerzetten
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Berichtdoor Rudi » 17 Jan 2018, 20:32

Oli Kraus die de U8g en U8g2 libraries maakte en onderhoud is erg behulpzaam maar je kan best eerst zoveel mogelijk zijn documentatie doornemen.

Uit de U8g2 faq:
Q: U8g2 requires a lot of memory. How to reduce this?
- Limit the font size. If possible avoid "f" fonts, instead use "r" fonts
- If the I2C interface is not required, then uncomment #define U8X8_HAVE_HW_I2C in U8x8lib.h
(Background: Due to a problem in Wire.h, the I2C Arduino lib is always included)


Kijk ook eens op Oli's Github U8g2 Issues paginas, o.a. issue #233 en #286 zouden kunnen soelaas bieden. Of de U8x8 library als je enkel tekst gebruikt.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 10
Geregistreerd: 26 Apr 2015, 19:22

Re: Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Berichtdoor Otto » 18 Jan 2018, 21:11

Beste Rudi, bedankt voor de tip, ik ga me verder verdiepen in de documentatie van Oli Kraus

Beste nicoverduin,
ik heb momenteel zeker niet voldoende kennis om het slimmer te maken. Alles is in korte blokken opgebouwd en steeds iets uitgebreid,
als u/jij eens wilt kijken of er zaken korter kunnen, HEEL GRAAG, ALVAST BEDANKT!!
het programma is op dit moment voor 99% klaar, op mijn bureau werkt het, alleen die geheugenwaarschuwing zit me niet lekker....
dat is geen goede basis voor een volgende 2 jaar 24 uur per dag aan en 7 dagen in de week.
hieronder de code:


/*PROGRAMMA Tracker2018v0.4-8hrs-------------------------------------------------bert schermers jan 2018
*v0.1, 22-12-2017 UNO vervangen door NANO, pinning aangepast, breadbord versie
*v0.2, 26-12-2017 20x4 display vervangen door NOKIA 5110, U8g2lib toegepast
*v0.3, 01-01-2018 Drukknop menu toegevoegd ,OneButton.h lib toegepast
*v0.4, 17-01-2018 10 sec wachttijd bij opstart toegevoegd voor handmatig/auto setup

* Componenten: Arduino NANO:
* Pinout: zie pdf TRACKER2018 v0.2 dd 07-01-2018
* Pulldown weerstand input Actuator omwentelingtellers A6/A0 en D4: 10K (br-zw-or) naar GND
* RealTimeClock DS3231RTC:
* GND = GND; VCC = +5V; SDA = A4; SCL = A5
* Nokia 5110 Display:
* pin1(reset) = nano pin D12; pin2 CE = nano pin D10 ;
* pin3 DC = nano pin D9; pin4 DataIN = nano pin D11;
* pin5 ClocK = nano pin D13; pin6 VCC (3,3V) = nano pin 3V3;
* pin7 BackLight = nano pin D3; pin8 gnd = GND
* Relaisbord 4 kanaals-5V:
* In1=nano D5; In2=nano pin D6; In3=nano pin D7; In4= nano pin D8
* K1 = Uit/Aan; K2=Omkeer; K3=Omkeer; K4= Actuator Hor of Ver
* SUPERJACK QARL 3636 actuator: OOST-WEST verstelling
* Stanglengte WEST HOH=ca 580mm , OOST ca 1400 mm HOH
* aantal stappen van oost naar west ca 1000
* SUPERJACK QARL 3624 actuator: OP-NEER verstelling
* Stanglengte Neer HOH=ca 320 mm, OP ca 680 mm HOH
* aantal stappen ca 450 van NEER naar OP
* Behuizing: Aluminium 500W halogeen bouwlamp behuizing
* Drukknop linksonder voor RESET
* Drukknop rechtsonder voor MENU
*
* PROGRAMMA:
* a) dagelijks 120 graden oost-west draaien in 8 uur: van 08:40 tot 16:40 (minuut 520 tot minuut 1000)
* b) elke ochtend om 04:00 uur (minuut 240) terugdraaien naar START positie (OOST)
* c) elke ochtend om 05:00 uur (minuut 300) VERTICAAL positie bijstellen
* d) Automatische herstart bij stroomuitval en vastlopen programma
* e) MENU: Eenvoudige STORMSTAND instelling: vaste middenstand
* f) MENU: Eenvoudige SNELLOOP procedure OOST-WEST: 1 dag in 10 minuten
* g) MENU: Eenvoudige SNELLOOP procedure OP-NEER: 1 jaar in 10 minuten
* h) MENU: verticaal reset overslaan bij herstart
* INSTELLEN:
* RTC datum en tijd instellen bij SU01!!
* Tijdinterval en aantal stappen aanpassen bij Lo03
* Programmaversienummer bij F13: //regel 4
* AANSTURING actuators:
* bijstellen naar WEST : relais K1
* terug naar OOST : relais K3, K2, K1
* naar OP (21december tot 21 juni): relais K4, K1
* naar NEER (21 juni tot 21 december): relais K4, K3 ,K2, K1
*/
// D01: Declaratie library's--------------------------------------------------------------------------------
#include <Time.h>
#include <TimeLib.h>
#include <DS3232RTC.h>
#include <Wire.h>
#include <OneButton.h>
#include <U8g2lib.h>

// D02: Declaratie Pinning Arduino--------------------------------------------------------------------------
const int TelSensorHor = 14; // input pin14(=A0 ook doorverbonden met A6,foutje) reedsensor horizontaal
const int TelSensorVer = 4; // input pin4 reedsensor verticaal
const int K4horVERT = 8; // output pin8 relais K4: keuze actuator horizontaal 36" of verticaal 24"
const int K3uitIN = 7; // output pin7 relais K2 en K3: actuator draairichting omkeer
const int K2uitIN = 6; // output pin6 relais K2 en K3: actuator draairichting omkeer
const int K1uitAAN = 5; // output pin5 relais K1: actuator 36V aan uit
const int BackLight = 3; // output pin3 (PWM voor helderheid) achtergrondverlichting LCD Nokia 5110
OneButton button(2, true); // input drukknop menustructuur voor de OneButtonLibrary

// D03 : Declaraties variabelen:---------------------------------------------------------------------------
int y = 0; // jaartal jjjj
int m = 0; // maand 1-12
int d = 0; // dag 1-31
int MOD = 0; // Minuut van de dag, 0-1440, nodig voor OOST_WEST positie
int DOY = 0; // Dag van het jaar, 0-365, nodig voor op-neer positie
int mTeller = 0; // Minutenteller voor het aantal minuten resetten Hor en Vert
int TelStatusHor1 = LOW; // ingangssignaal van de oost-west sensor
int TelStatusHor2 = LOW; // 2x inlezen (25ms na elkaar) voor anti-dender, debounce
int TelVorigeStatusHor = LOW; // verschil met status geeft opgaande flank detectie
int TelStatusVer1 = LOW; // ingangssignaal van de op-neer sensor
int TelStatusVer2 = LOW; // 2x inlezen (25ms na elkaar) voor antidender, debounce
int TelVorigeStatusVer = LOW; // verschil met status geeft opgaande flank detectie
int TelStandHor = 0; // huidige tellerstand reedrelais oost-west draaien
int TelStandHorNw = 0; // nieuwe tellerstand reedrelais oost-west draaien
int TelStandVer = 0; // huidige stand Op-Neer
int TelStandVerNw = 0; // nieuwe stand op-neer
short tempC; // temp sensor DS3231
String LCDregel5 = "NANO START UP"; // 5e regel display = Informatie regel
String LCDregel4 = "*Menuinformatie*"; // extra inforegel bij menukeuze
int statusEnkelklik = 0; // registratie drukknop 1x kort indrukken
int statusDubbelklik = 0; // registratie drukknop 2x kort indrukken
int statusLangeklik = 0; // registratie drukknop lang indrukken
int LCDsecTeller = 0; // secondenteller voor LCD uitschakelijk na 15 sec geen gebruik in loop
unsigned long menutijd;

int days[] = { 0,31,59,90,120,151,181,212,243,273,304,334 }; // Dag no. op 1e van de maand cumulatief

U8G2_PCD8544_84X48_F_4W_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 9, 12); // Declaratie LCD Display uit de U8G2 library

// EINDE DECLARATIES, NU VOLGT SETUP, wordt 1x doorlopen--------------------------------------------------------------

void setup() {
// SU01: Opstarten display, I2C, RTC Klok--------------------------------------------------------------------------------
u8g2.begin(); // Opstart LCD
Wire.begin(); // Opstart I2C communicatie (RTC)
setSyncProvider(RTC.get); // the function to get the time from the RTC
setSyncInterval(86400); // 1x per dag een re-sync

// TIJD INSTELLEN: Deze 2 regels activeren, instellen en uploaden. Daarna weer van // voorzien en nogmaals uploaden!!
// setTime(10, 51, 0, 6, 1, 2018); // Huidige tijd opgeven voor RTC (h,m,s,d,m,yyyy)
// RTC.set(now()); // Uploaden naar RTC

DagvhJaar(); // Functie F01: Berekend de dag van het jaar ( voor de OP-NEER instelling)
analogWrite(BackLight,100); // Achtergrondverlichting aan (3,3V = 160!!)
OpLCDscherm(); delay (1000); // display invullen datum, tijd, positie panelen

// SU02: Instellen Inputs,Output, Startinstellingen-------------------------------------------------------------
pinMode(TelSensorHor, INPUT);
pinMode(TelSensorVer, INPUT);
pinMode(K1uitAAN, OUTPUT);
pinMode(K2uitIN, OUTPUT);
pinMode(K3uitIN, OUTPUT);
pinMode(K4horVERT, OUTPUT);

digitalWrite(TelSensorHor, LOW);
digitalWrite(TelSensorVer, LOW);
digitalWrite(K1uitAAN, HIGH);
digitalWrite(K2uitIN, HIGH);
digitalWrite(K3uitIN, HIGH);
digitalWrite(K4horVERT, HIGH);

button.attachClick(enkelklik);
button.attachDoubleClick(dubbelklik);
button.attachLongPressStart(langeklik);

// Su03: Set up Menu: 10 seconden om handmatig voor horizontaal of verticaal instellen te kiezen
// Als na 10 seconden het menu niet bediend is, dan wordt zowel horizontaal als verticaal ingesteld.

LCDregel5 = "AUTO SETUP / MENU"; // mogelijkheid voor kiezen AUTO_ SETUP / HAND
menutijd = millis();
while ((millis() - menutijd)<10000){ // 10 seconden wachttijd oor menubediening, anders automatische setup
button.tick(); delay(10); //check op indrukken knop
OpLCDscherm2();} // aftellen seconden op regel 3

if (statusDubbelklik == 0); {
SetOostWest(); //is functie Fu09
SetOpNeer(); } //is functie Fu10
LCDregel5 = "EINDE SETUP";
OpLCDscherm();
mTeller = MOD;
delay(2000); }
//-EINDE SETUP -Nu volgt LOOP: wordt continue doorlopen-------------------------------------------------------------------------------------------------------------

void loop() { // LOOP: to run repeatedly
button.tick(); delay(10); //check op indrukken knop
if (statusEnkelklik == 0)
{LCDregel5 = "TRACKER AUTOMAAT";}
OpLCDscherm();
if (MOD - mTeller > 2) {analogWrite (BackLight,0);}

//Lo00: Elke ochtend om 00:00:01 de DOY aanpassen (bij opstart en 1x per dag)
tmElements_t tm; RTC.read(tm);
if (MOD == 0 && tm.Second % 60 == 1) { DagvhJaar(); }

// Lo01: ELKE OCHTEND HORIZONTAAL TERUGDRAAIEN NAAR HET OOSTEN.
if (MOD == 300 && tm.Second % 60 == 1){ // om 05:00:01 naar begin positie dag = FU06
LCDregel5 = "6.OCHTEND RESET HORIZ";
analogWrite(BackLight,100); // Achtergrondverlichting aan (3,3V = 160!!)
OpLCDscherm();
DraaiWestOost(); }

// Lo02: ELKE OCHTEND VERTICAALSTAND CONTROLEREN, ELKE 4e DAG BIJSTELLEN-------------------------------------------------
if (MOD == 360 && tm.Second % 60 == 1) { // om 06:00:01 verticaal bijstellen
LCDregel5 = "7.OCHTEND RESET VERTI";
OpLCDscherm();
if (DOY < 172 && DOY % 4 == 0) { // tussen 1 januari en 21 juni
TelStandVerNw = (25 + (DOY*2.5)); // 2,5 omw. per dag
DraaiNeerOp();} // de actuator uitdraaien
else if (DOY > 173 && DOY < 354 && DOY % 4 == 0) { // tussen 21 juni en 21 december
TelStandVerNw = (450 - (DOY - 171)*2.5); // elke 4 dagen 10 stappen
DraaiOpNeer();} // de actuator indraaien
else if (DOY > 356 && DOY < 366 && DOY % 4 == 0) { // tussen 21 december en 1 januari
TelStandVerNw = ((DOY - 355)*2.5); // elke 4 dagen 10 stappen
DraaiNeerOp(); } // de actuator uitdraaien
}

// Lo03: TUSSEN 8.40 EN 16.40 ELKE 10 MINUTEN 20 STAPPEN HORIZONTAAL NAAR WEST--------------------------------------------
if (MOD >= 518 && MOD < 998) { // is het tussen 8:38 en 16:38??
tmElements_t tm; RTC.read(tm);
if (tm.Minute % 10 == 0 && tm.Second % 60 == 1) { // elke 10 minuten op sec 01
LCDregel5 = "8.INSTELLEN TRACKER";
OpLCDscherm();
delay(2000);
TelStandHorNw = (((MOD - 510) / 10) * 20); // 28 stappen per 15 min vanaf 08:40
DraaiOostWest(); } } } // is functie Fu04

// EINDE Void LOOP() NU VOLGEN DE FUNCTIEPROGRAMMA'S-------------------------------------------------------

// Fu01: BEREKEN DE DAG VAN HET JAAR. ----------------------------------------------------------------------
void DagvhJaar() {
tmElements_t tm; RTC.read(tm);
m = tm.Month;
d = tm.Day;
y = tm.Year;
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) { // controle schrikkeljaar
if (m == 1 || m == 2){ DOY = days[(m - 1)] + d;} // schrikkeljaar: januari en februari
else {DOY = days[(m - 1)] + d + 1;} } // schrikkeljaar: maart en verder +1 dag
else {DOY = days[(m - 1)] + d;} } // alle niet-schrikkeljaren

// Fu02: BEREKEN DE MINUUT VAN DE DAG.------------------------------------------------------------------------
void MinvdDag() {
tmElements_t tm; RTC.read(tm);
MOD = (tm.Hour * 60 + tm.Minute); }

// Fu03: DRAAI van OOST naar WEST tot TelStandHorNw ---------------------------------------------------------
void DraaiOostWest() {
digitalWrite(K1uitAAN, LOW);
while (TelStandHor<TelStandHorNw) {
TelStatusHor1 = digitalRead(TelSensorHor); delay(25); // anti dender
TelStatusHor2 = digitalRead(TelSensorHor);
if (TelStatusHor1 == TelStatusHor2 && TelStatusHor1 != TelVorigeStatusHor && TelStatusHor1 == HIGH) {
TelStandHor++;
OpLCDscherm();
}
TelVorigeStatusHor = TelStatusHor1;
}
digitalWrite(K1uitAAN, HIGH);
mTeller = MOD;}

// Fu04: DRAAI van WEST naar OOST tot a) TelStandHorNw of b) de EINDAANSLAG---------------------------------------------------------------
void DraaiWestOost() {
digitalWrite(K3uitIN, LOW); delay(300); // omkeerrelais aan
digitalWrite(K2uitIN, LOW); delay(300); // omkeerrelais aan
digitalWrite(K1uitAAN, LOW); // startrelais aan

if (TelStandHorNw == 500){ // wordt uitgevoerd bij stormstand
while (TelStandHor > TelStandHorNw) {
TelStatusHor1 = digitalRead(TelSensorHor); delay(25); // delay = anti-dender
TelStatusHor2 = digitalRead(TelSensorHor);
if (TelStatusHor1 == TelStatusHor2 && TelStatusHor1 != TelVorigeStatusHor && TelStatusHor1 == HIGH) {
TelStandHor--; OpLCDscherm(); }
TelVorigeStatusHor = TelStatusHor1; } }
else { // wordt uitgevoerd om 05:00 elke ochtend. terug naar 0-punt
TelStandHor = 0; mTeller = MOD;
while ((MOD - mTeller)<1) { OpLCDscherm(); } } // DEMO, DIT MOET 4 minuten ZIJN!!!

digitalWrite(K1uitAAN, HIGH); delay(300); // relais weer uit
digitalWrite(K2uitIN, HIGH); delay(300);
digitalWrite(K3uitIN, HIGH);
mTeller = MOD; }

// Fu05: DRAAI van OP naar NEER tot TelStandVerNw-------------------------------------------------------------
void DraaiOpNeer() {
digitalWrite(K4horVERT, LOW); delay(300); // zet relais aan ...
digitalWrite(K3uitIN, LOW); delay(300);
digitalWrite(K2uitIN, LOW); delay(300);
digitalWrite(K1uitAAN, LOW);
if (TelStandVerNw == 0) { //SETUP NULPUNT OPZOEKEN
TelStandVer = 0;
mTeller = MOD;
while ((MOD - mTeller)<1) { OpLCDscherm();} } //DEMO!! MOET ZIJN KLEINER DAN 4 !!

else { // van 21 juni tot 21 december
while (TelStandVer >TelStandVerNw) { // tot de juiste positie de motor aan
TelStatusVer1 = digitalRead(TelSensorVer); delay(25);
TelStatusVer2 = digitalRead(TelSensorVer);
if (TelStatusVer1 == TelStatusVer2 && TelStatusVer1 != TelVorigeStatusVer && TelStatusVer1 == HIGH) {
TelStandVer--; OpLCDscherm();}
TelVorigeStatusVer = TelStatusVer1; } }

digitalWrite(K1uitAAN, HIGH); delay(300); // ... en de relais weer uit.
digitalWrite(K2uitIN, HIGH); delay(300);
digitalWrite(K3uitIN, HIGH); delay(300);
digitalWrite(K4horVERT, HIGH);
mTeller = MOD;
}

// Fu06: DRAAI van NEER naar OP tot TelStandVerNw-------------------------------------------------------------
void DraaiNeerOp() {
digitalWrite(K4horVERT, LOW); delay(300); // zet relais aan ...
digitalWrite(K1uitAAN, LOW);
while (TelStandVer <TelStandVerNw) { // tot de juiste positie de motor aan
TelStatusVer1 = digitalRead(TelSensorVer); delay(25); // anti-dender delay
TelStatusVer2 = digitalRead(TelSensorVer);
if (TelStatusVer1 == TelStatusVer2 && TelStatusVer1 != TelVorigeStatusVer && TelStatusVer1 == HIGH) {
TelStandVer++; OpLCDscherm(); }
TelVorigeStatusVer = TelStatusVer1; }
digitalWrite(K1uitAAN, HIGH); delay(300); // ... en de relais weer uit.
digitalWrite(K4horVERT, HIGH);
mTeller = MOD; }

// Fu07:OneButton. afhandeling van het indrukken van de Onebutton menuknop
// FU07a afhandeling enkele klik menuknop = TOON Menu
void enkelklik() { // knop kort indrukken = keuzemenu op regel5
analogWrite (BackLight,100);
menutijd = millis();
statusEnkelklik++; // teller 1 verhogen
if (statusEnkelklik==6) {statusEnkelklik = 0;} // bij einde opties terug naar voidLOOP
if (statusEnkelklik == 1) {LCDregel5= "ALLEEN HORI SETUP";} // afdrukken menuopties
if (statusEnkelklik == 2) {LCDregel5= "ALLEEN VERT SETUP";}
if (statusEnkelklik == 3) {LCDregel5= "***STORMSTAND!***";}
if (statusEnkelklik == 4) {LCDregel5= "*DEMO OOST-WEST*";}
if (statusEnkelklik == 5) {LCDregel5= "**DEMO OP-NEER**";} }

// Fu07b afhandelen dubbele klik menuknop = UITVOEREN gekozen menuoptie
void dubbelklik() { // knop 2x indrukken = uitvoeren menukeuze
statusDubbelklik++;
if (statusEnkelklik == 1) {LCDregel5= "SETUP HORIZONTAAL";SetOostWest();} // = Fu09
if (statusEnkelklik == 2) {LCDregel5= "*SETUP VERTICAAL*"; SetOpNeer();} // = Fu10
if (statusEnkelklik == 3) {LCDregel5= "NAAR STORMSTAND";Stormstand();} // = Fu08
if (statusEnkelklik == 4) {LCDregel5= "*DEMO OOST-WEST*"; DemoOostWest();} // = Fu11
if (statusEnkelklik == 5) {LCDregel5= "**DEMO OP-NEER**"; DemoOpNeer();} // = Fu12
OpLCDscherm();
delay (2000);
statusEnkelklik = 0; }

// FU07c afhandelen lange klik menuknop = Test Softwarematig Reset, nog te maken
void langeklik() { }


//Fu08 Instellen Stormstand
void Stormstand() {
TelStandHorNw =500; // Middenstand, nog controleren
if (TelStandHor < TelStandHorNw) {DraaiOostWest();} // bepalen draairichting en op juiste stand stellen
else if (TelStandHor > TelStandHorNw) {DraaiWestOost();} // bepalen draairichting en op juiste stand stellen
while (1){ // Programma vastloper zodat voidLOOP niet meer bereikt wordt
LCDregel5= "VASTopSTORMSTAND"; // Melding op LCD
OpLCDscherm(); delay (3000);
LCDregel5= "RESET to RESTART";
OpLCDscherm(); delay (3000);} }

//Fu09 Setup Oost-West stand
void SetOostWest() { // eerst terugdraaien naar nulpunt
LCDregel5 = "NAAR NULPUNT OOST";
DraaiWestOost(); delay(500); // is functie Fu04
LCDregel5 = "*ZOEK POS HORIZ.*"; // dan nieuwe positie opzoeken
OpLCDscherm();
if (MOD < 520) { TelStandHorNw = 0; } // is het tussen 0:00 en 08:40?// blijft in de oost stand
else if (MOD >= 520 && MOD < 1000) { // is het tussen 08:40 en 16:40??
TelStandHorNw = ((MOD - 520) *1.9); } // Bereken de huidige positie van de tracker
else TelStandHorNw = 940; // is het tussen 16:45 en 23:59?? Naar de WEST stand
TelStandHorNw = 5; //DEMO!! DEZE REGEL MOET ERUIT
DraaiOostWest(); // is functie Fu03
mTeller = MOD; }

//Fu10 Setup Op-Neer Stand
void SetOpNeer() {
LCDregel5 = "NAAR NULPUNT NEER";
TelStandVerNw = 0; // eerst nulpunt opzoeken (= beneden, 21 december stand)
OpLCDscherm();
DraaiOpNeer(); // is functie Fu05
LCDregel5 = "ZOEK POS NEER-OP"; // nu de juiste stand weer opzoeken
OpLCDscherm(); delay(2000);
if (DOY > 0 && DOY < 172) { TelStandVerNw = (25 + (DOY*2.5)); } // positie van 1 januari tot 21 juni: 2,5 omw. in per dag (+25 voor 21dec tot 01jan)
else if (DOY > 173 && DOY < 354) { // positie 21 juni tot 21 december
TelStandVerNw = (450 - (DOY - 171)*2.5); }
else if (DOY > 356 && DOY < 366) { // positie van 21 december tot 1 januari
TelStandVerNw = ((DOY - 355)*2.5); }
TelStandVerNw = 5; //DEMO!! DEZE REGEL MOET ERUIT
DraaiNeerOp(); // is functie Fu06
mTeller = MOD; }

// Fu11 Demo Oost West = versneld afdraaien oost west programma voor testen
void DemoOostWest(){
LCDregel5 = "O-W DEMO:NULPUNT"; // terugstellen naar nul
DraaiWestOost(); delay(500); // is functie Fu04
for (int i=0; i < 48; i++) {
LCDregel5 = "OOST-WEST DEMO/**";
TelStandHorNw = TelStandHor + 20;
DraaiOostWest(); } mTeller = MOD; } // is functie Fu03

// Fu12 Demo Op en Neergaande beweging
void DemoOpNeer(){
LCDregel5 = "OP-NEERdemo:0PNT";
TelStandVerNw = 0;
DraaiOpNeer(); delay(500); // Fu05 : terugstellen naar nul
for (int i=0; i<45; i++){ // in werkelijkheid 5 stappen: 360dagen/4=90: 45 op en 45 neer
LCDregel5 = "NEER-OP DEMO/**"; // Demo van NEER naar OP stand
delay (2000);
TelStandVerNw = TelStandVer + 10;
DraaiNeerOp();}
delay(5000);
LCDregel5 = "OP-NEER DEMO/**";
TelStandVerNw = TelStandVer - 10;
for (int i=0; i<45; i++){ // in werkelijkheid 5 stappen: 360dagen/4=90: 45 op en 45 neer
LCDregel5 = "OP-NEER DEMO/**"; // Demo van NEER naar OP stand
delay (2000);
TelStandVerNw = TelStandVer - 10;
DraaiOpNeer(); } mTeller = MOD; }

// Fu13: OP NOKIA 5110 LCD SCHERM afdrukken
void OpLCDscherm() {
// SetUp
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_5x8_tr); // choose a suitable font
tmElements_t tm; RTC.read(tm); // datum en tijd uitlezen
m = tm.Month;
d = tm.Day;
y = tm.Year;
MOD = (tm.Hour * 60 + tm.Minute);

//Regel_1: DATUM en TIJD
u8g2.setCursor(0, 7);
if (tm.Day < 10) u8g2.print("0"); // voorloop nul
u8g2.print(tm.Day, DEC); u8g2.print('-');
if (tm.Month < 10) u8g2.print("0");
u8g2.print(tm.Month, DEC); u8g2.print('-');
u8g2.print(tm.Year - 30, DEC); u8g2.print(' ');

u8g2.setCursor(45, 7);
if (tm.Hour < 10) u8g2.print("0");
u8g2.print(tm.Hour, DEC); u8g2.print(":");
if (tm.Minute < 10) u8g2.print("0");
u8g2.print(tm.Minute, DEC); u8g2.print(":");
if (tm.Second < 10) u8g2.print("0");
u8g2.print(tm.Second, DEC);

// Regel_2: positie HOR en VERT
u8g2.setCursor(0, 17);
u8g2.print("Hor:"); u8g2.print(TelStandHor);
u8g2.setCursor(45, 17);
u8g2.print("Vert:"); u8g2.print(TelStandVer);

// Regel_3: DOY en MOD
u8g2.setCursor(0, 27);
u8g2.print("DOY=");
if (DOY < 100) u8g2.print(" ");
u8g2.print(DOY);

u8g2.setCursor(45, 27);
u8g2.print("MOD=");
if (MOD<1000) u8g2.print(" ");
u8g2.print(MOD);

// Regel_4: TEMPERATUUR en versienummer
// tmElements_t tm; RTC.read(tm);
tempC = (RTC.temperature() / 4);
u8g2.setCursor(0, 37);
u8g2.print("T=");
if (tempC < 10) u8g2.print("0"); // voorloop nul
u8g2.print(tempC, 0);
u8g2.print(" C.");

u8g2.setCursor(45, 37);
u8g2.print("v0.4");

// Regel_5: Tracker STATUS
u8g2.setCursor(0, 48);
u8g2.print(LCDregel5);

u8g2.sendBuffer();} // transfer internal memory to the display

// Fu14 Op Nokia Scherm afdrukken: Aftellen Auto Startup/ Hand menu
void OpLCDscherm2() {
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_5x8_tr); // choose a suitable font
tmElements_t tm; RTC.read(tm); // datum en tijd uitlezen

u8g2.setCursor(0, 7);
if (tm.Day < 10) u8g2.print("0"); // voorloop nul
u8g2.print(tm.Day, DEC); u8g2.print('-');
if (tm.Month < 10) u8g2.print("0");
u8g2.print(tm.Month, DEC); u8g2.print('-');
u8g2.print(tm.Year - 30, DEC); u8g2.print(' ');

u8g2.setCursor(45, 7);
if (tm.Hour < 10) u8g2.print("0");
u8g2.print(tm.Hour, DEC); u8g2.print(":");
if (tm.Minute < 10) u8g2.print("0");
u8g2.print(tm.Minute, DEC); u8g2.print(":");
if (tm.Second < 10) u8g2.print("0");
u8g2.print(tm.Second, DEC);

u8g2.setCursor(40, 27);
u8g2.print(10-((millis()-menutijd)/1000));

// Regel_5: Tracker STATUS
u8g2.setCursor(0, 48);
u8g2.print(LCDregel5);

u8g2.sendBuffer(); } // transfer internal memory to the display

Berichten: 10
Geregistreerd: 26 Apr 2015, 19:22

Re: Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Berichtdoor Otto » 22 Jan 2018, 11:27

Beste Rudi:
Met de oplossingen voor de u8g2 lib van Oli Kraus kom ik niet zoveel verder, waarschijnlijk omdat ik al geen grafische dingen gebruikt heb tot nu toe
met het toepassen van de U8x8 lib scheelt wel heel veel:
de schets gebruikt nu 42% van het geheugen ipv 58% in de u8g2 versie,
de globale variabelen gebruiken nu 873 bytes (42%) tov 1651 bytes (80%) van het dynamisch geheugen
Resterend 1175 bytes tov 397 bytes ( van de 2048) in de u8g2 versie.

De melding "Weinig geheugen beschikbaar, er kunnen zich stabiliteitsproblemen voordoen" is bij gebruik van de u8x8lib verdwenen!!
Dus dat probleem is opgelost.
Qua indeling van de LCD moet ik nog eea veranderen:
Met de u8g2 lib had ik 5 regels van 16 tekens beschikbaar, met U8x8 zijn het 6 regels van 10 tekens per regel.
Ik ga deze week de besturing op de solar tracker proberen, optie is nog het programma vereenvoudigen zodat er voldoende ruimte is voor de u8g2 lib

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

Re: Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Berichtdoor nicoverduin » 22 Jan 2018, 12:16

Alles wat tussen dubbele quotes zit kun je in flash zetten. Zie progmem bij arduino
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 26 Apr 2015, 19:22

Re: Nokia5110 u8g2 lib + Nano v3.0 + geheugen

Berichtdoor Otto » 23 Jan 2018, 20:28

Bedankt! dat PROGMEM stuk ga ik zeker uitzoeken, maar zal wel weekend worden. Ik hoop daarmee weer ruimte te krijgen voor de U8g2 lib, want de U8x8 is wel heel summier qua variaties.
in vergelijking met de U8x8 lib had ik net zo goed -of beter- het 16x2LCD kunnen houden. U leest nog of het me lukt!

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten