programeren met classes en tabbladen
12 berichten
• Pagina 1 van 2 • 1, 2
programeren met classes en tabbladen
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"); >
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
Re: programeren met classes en tabbladen
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.
SSD1306 screen(0x3c, 5, 4); Als ik deze regel voor de Screen.Drawstring zet in het 2e tabblad krijg ik geen foutmelding meer.
Re: programeren met classes en tabbladen
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.
je kunt op deze manier dus 2 verschillende screens aanhebben staan met gelijke parameters, maar verschillende teksten etc.
paul deelen
shooter@home.nl
shooter@home.nl
Re: programeren met classes en tabbladen
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.
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.
Re: programeren met classes en tabbladen
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:
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.
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.
Re: programeren met classes en tabbladen
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
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
Re: programeren met classes en tabbladen
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
temperatuur.h
temperatuur.ino
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);
}
Re: programeren met classes en tabbladen
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.
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.
Re: programeren met classes en tabbladen
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.
Dat voorbeeld wat je in de link plaatste is voor mij een beetje te moeilijk met mijn programeerkennis.
Re: programeren met classes en tabbladen
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
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();
}
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten