programeren met classes en tabbladen

Software vragen voor ESP chip familie
Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

programeren met classes en tabbladen

Berichtdoor ercmrj » 30 Nov 2019, 10:33

Om mijn sketch wat overzichtelijker te ben ik me aan het verdiepen in het programmeren met classes en tabbladen.

Ik heb een WeMoS LOLIN 32 met Oled scherm en wil graag in een tabblad de screen.drawfunctie gebruiken. Dat lukt me echter niet erwijl ik bij de LCD functie geen foutmelding krijg.

In de onderstaande sketch krijg ik een foutmelding bij de regel < screen.drawString(50, 30, "eric"); >

Code: Alles selecteren
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include "SSD1306.h"           //Oled scherm

#include "tt.h"

SSD1306  screen(0x3c, 5, 4);   //Oled scherm

void setup() {
  screen.init();                        //Oled scherm
  screen.clear();                     //Oled screen
 
lcd.begin(16,2); // Start-Up Display
lcd.setCursor(0,0);
delay(500);


}

void loop(){
  screen.clear();                     //Oled screen
  screen.setTextAlignment(TEXT_ALIGN_CENTER);  //Oled screen

MN.ttLoop();

  screen.display();  //Oled screen
  delay(10);
}


Code: Alles selecteren
class mijn {

public:

void ttLoop() {
lcd.setCursor(9,2);
lcd.print("eric");
screen.drawString(50, 30, "eric");  // hier gaat het fout
}
 
};
mijn MN;


Advertisement

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: programeren met classes en tabbladen

Berichtdoor ercmrj » 30 Nov 2019, 11:44

Het lijkt erop dat ik er al achter ben

SSD1306 screen(0x3c, 5, 4); Als ik deze regel voor de Screen.Drawstring zet in het 2e tabblad krijg ik geen foutmelding meer.

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

Re: programeren met classes en tabbladen

Berichtdoor shooter » 01 Dec 2019, 20:33

dat komt omdat het verschillende programmas zijn, als je een include doet of een aanroep dan gaat het goed,
je kunt op deze manier dus 2 verschillende screens aanhebben staan met gelijke parameters, maar verschillende teksten etc.
paul deelen
shooter@home.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: programeren met classes en tabbladen

Berichtdoor ercmrj » 01 Dec 2019, 20:45

Ik krijg het nog niet onder de knie. Het lijkt erop dat het allemaal nog niet zo goed werkt deze manier van programmeren of het moet aan mij liggen.

Soms werkt het wel en soms niet en ik kan niet vinden wat er anders aan de sketches is. Als je een paar include ..... hebt in de hoofdsketch krijg je de ene keer wel en de andere keer niet een foutmelding in je tabblad met de melding dat ie de variable niet kan vinden die in de sketch staat die de include aanroept.

Ik kan ook niet veel tutorials vinden op internet waar dit alles uitgelegd wordt.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: programeren met classes en tabbladen

Berichtdoor Koepel » 02 Dec 2019, 00:27

Dat probleem heb ik ook wel eens.

Stel dat de naam van je project "TestProject" is.
Dan wordt er een map "TestProject" aangemaakt met daarin "TestProject.ino".
Het meest linkse tabblad bevat de hoofdsketch, het bestand "TestProject.ino" en het tabblad heeft de naam "TestProject".

De Arduino IDE verzamelt alle *.ino bij elkaar, en geeft die als één blok aan de compiler.
Maar eerst gaat de Arduino preprocessor er doorheen. Die gaat bijvoorbeeld automatisch functieprototyping toevoegen. Die preprocessor maakt wel eens fouten.

In principe zou je alles in de hoofdsketch kunnen includen, en dan kan alle code in ieder tabblad het gebruiken.
Maar dat werkt niet altijd.
Als je ook nog *.h en *.cpp bestanden in je project hebt, dan wordt het nog ingewikkelder.

Wanneer ik een library in een tabblad gebruik of een *.h van het eigen project, dan include ik die alleen in dat tabblad. Mocht dat niet werken, dan verplaats ik dat naar de hoofdsketch.
Soms is het nodig om prototyping toe te voegen aan een *.h van het eigen project, en soms is dat niet nodig.

Let goed op dat je geen variabelen declareert in een eigen *.h bestand. De definite van een class hoort daar wel, maar de declaratie van het object (dat is een declaratie van een variabele) dan weer niet.
Stel dat ik een eigen "crcCalc.h" in mijn project heb, dan gebruik ik tegenwoordig altijd dit:

Code: Alles selecteren
#ifndef _CRCCALC_H_
#define _CRCCALC_H_

// Hier de inhoud van het *.h bestand, zoals speciale includes, classes, defines, eventueel prototyping, enzovoorts.

#endif


Soms heb ik het prima werkend, maar dan komt er een nieuwe Arduino IDE met een update van de preprocessor. Dan kan ik weer opnieuw gaan uitvogelen wat het meest eenvoudigste en meest duidelijkste is dat de Arduino preprocessor nog pakt.

Nou, dat werd weer een lange post. Maar ik hoop dat het iets minder onduidelijk is.
Met een meer professionele ontwikkelomgeving heb je deze ongein vanzelfsprekend niet. Dit zijn de rare donkere steegjes van de Arduino IDE.

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: programeren met classes en tabbladen

Berichtdoor ercmrj » 02 Dec 2019, 09:28

Mijn 3d printer werkt ook met arduino en heeft ook een sketch met heel veel tabbladen. Daarin zag ik inderdaad ook die #ifndef #define en #endif regelmatig terugkomen.

Ik heb nu alles weer in een sketch gezet, maar zal toch nog eens stap voor stap proberen met deze nieuwe informatie

Bedankt Koepel en shooter

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: programeren met classes en tabbladen

Berichtdoor ercmrj » 02 Dec 2019, 20:44

Onderstaande sketches geprobeerd maar lukt nog niet echt. Ook niet als ik de 2 include regels naar de tab temperauur verplaats. Staan nu in het voorbeeld als remark

Laatste sketch temperatuur.ino werkt wel, maar dat is zonder tabs.

test.ino
Code: Alles selecteren
#include <OneWire.h>
#include <DallasTemperature.h>
#include "temperatuur.h"

 
 
const int oneWireBus = 16;   
OneWire oneWire(oneWireBus); 
DallasTemperature sensors(&oneWire);

void setup() {
  CLC.setupTemperatuur();
 }


void loop()
{
  CLC.loopTemperatuur();
}


temperatuur.h
Code: Alles selecteren
#ifndef TEMPERATUUR_H
#define TEMPERATUUR_H

//#include <OneWire.h>
//#include <DallasTemperature.h>

class Celcius {
private:
//#include <OneWire.h>
//#include <DallasTemperature.h>
public:

void setupTemperatuur()
{
  sensors.begin();
}
 
void loopTemperatuur()
{
  sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  delay(1000);
 }
};

Celcius CLC;

#endif //__TEMPERATUUR_H


temperatuur.ino

Code: Alles selecteren
#include <OneWire.h>
#include <DallasTemperature.h>

const int oneWireBus = 16;     //is D2 op WeMos D1

OneWire oneWire(oneWireBus);

DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  delay(1000);
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: programeren met classes en tabbladen

Berichtdoor Koepel » 03 Dec 2019, 02:27

Om een class te gebruiken kun je beter eenvoudig beginnen.
Je wilt nu twee andere classes gebruiken in jouw eigen class. Dat kan niet zomaar zoals je nu doet.
Een class is een definitie van een uitgebreide variabele. Het definieert alleen maar de structuur. Als je variabelen wilt gebruiken van buiten de class, dan wordt het al minder eenvoudig.

Je wilt een class gebruiken zoals je losse functies zou gebruiken. Bekijk eens online voorbeelden en probeer eens een gewone class te maken. Daarna kun je proberen om andere classes te gebruiken vanuit jouw class.

In je "temperatuur.ino" heb je ook een setup() en ook een loop(). Dat kan niet. Die staan al in "test.ino".

Er zijn verschillende manieren om in je eigen class een andere class te gebruiken.
Dit is een voorbeeld van een manier: https://github.com/elucify/thermometer.
Die declareert een OneWire en een DallasTemperature object als 'static' binnen de eigen class. Dat is best wel lelijk. Ik probeerde om dat beter te doen, maar dat lukte niet. De DallasTemperature heeft blijkbaar al dingen in zich die dat lastig maken.

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: programeren met classes en tabbladen

Berichtdoor ercmrj » 03 Dec 2019, 19:36

Pfff, ik zet het maar even in de ijskast tot ik wat meer ervaring met classes.
Dat voorbeeld wat je in de link plaatste is voor mij een beetje te moeilijk met mijn programeerkennis.

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: programeren met classes en tabbladen

Berichtdoor ercmrj » 04 Dec 2019, 14:16

Ik heb wel een alternatieve manier gevonden om het wat overzichtelijker te maken. Ik weet niet of deze manier nog haken en ogen heeft maar het schijnt wel te werken.
Ik zet nu alle 3 de sketches onder elkaar in één sketch op deze manier.
Zo kun je mooi een sketch eerst los programeren uittesten en dan in je hoofdsketch plakken zonder al te veel knip en plak werk

Ik wist eigenlijk niet dat je de variabelen en #include .... regels zomaar overal tussen kunt zetten

Code: Alles selecteren
/*

#include .......


// declareer variabelen

void setupSketch1() {
}

void loopSketch1() {

  }
}


//sketch 2

#include ..........

// declareer variabelen sketch 2

void setupSketch2() {
}

void loopSketch2() {

  }
}

//   sketch 3

#include .........

// declareer variabelen sketch3

void setupSketch3() {
}

void loopSketch3() {

  }
}

// einde sketches

void setup(){
  setupSketch1();
  setupSketch2();
  setupSketch3();
}

void loop(){
  loopSketch1();
  loopSketch2();
  loopSketch3();
}

Volgende

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten