aanroepen van eigen code
12 berichten
• Pagina 1 van 2 • 1, 2
aanroepen van eigen code
Ik ben me nog een beetje aan het verdiepen in het schrijven van code voor de Arduino.
Ik zie dat er in de voorbeeld programma's veel verwijzingen naar andere .h scripts zijn.
Om beter inzicht te krijgen in de werking van de programma's wil ik enkel eigen programma codes aanroepen, hoe kan ik hiervoor zorgen ?
Kan ik de programma's die ik zelf maak allemaal verzamelen in 1 directory en deze aanroepen vanuit de code ?
Zo krijg ik beter inzicht in wat er allemaal wordt geladen en krijg ik meer inzicht in de code.
Ik zie dat er in de voorbeeld programma's veel verwijzingen naar andere .h scripts zijn.
Om beter inzicht te krijgen in de werking van de programma's wil ik enkel eigen programma codes aanroepen, hoe kan ik hiervoor zorgen ?
Kan ik de programma's die ik zelf maak allemaal verzamelen in 1 directory en deze aanroepen vanuit de code ?
Zo krijg ik beter inzicht in wat er allemaal wordt geladen en krijg ik meer inzicht in de code.
Advertisement
Re: aanroepen van eigen code
Een bibliotheek installeren gaat het gemakkelijkst via het menu: Schets / Bibliotheek gebruiken / Bibliotheek beheren.
Nadat die bibliotheek is geinstalleerd is er een *.h bestand om te gebruiken met #include <voorbeeld.h>, daar staan de definities in om de functies in de bibliotheek te gebruiken.
Je eigen project staat in één map, onder C:\Mijn documenten\Arduino
Wanneer de Arduino IDE niet is gestart, dan kun je *.cpp en *.h bestanden naar de map van je project kopiëren. Die verschijnen dan als tabbladen in de Arduino IDE.
Je kunt ook zelf tabbladen toevoegen. Dat gaat met het drop-down menu rechtsboven.
Een naam zonder extensie krijgt *.ino maar je kunt ook .cpp of .h voor het bestand gebruiken.
Een fout die ik maakte: Wanneer je een project opslaat onder een nieuwe naam, dan gaan alleen de bestanden mee die in de tabbladen staan. Wanneer je het oude project verwijderd, dan zijn backups zoals *.zip en documenatie verdwenen. Dus mijn backups zet ik tegenwoordig als .zip bestand in C:\Mijn documenten\Arduino en niet meer in de map van het project zelf.
Nadat die bibliotheek is geinstalleerd is er een *.h bestand om te gebruiken met #include <voorbeeld.h>, daar staan de definities in om de functies in de bibliotheek te gebruiken.
Je eigen project staat in één map, onder C:\Mijn documenten\Arduino
Wanneer de Arduino IDE niet is gestart, dan kun je *.cpp en *.h bestanden naar de map van je project kopiëren. Die verschijnen dan als tabbladen in de Arduino IDE.
Je kunt ook zelf tabbladen toevoegen. Dat gaat met het drop-down menu rechtsboven.
Een naam zonder extensie krijgt *.ino maar je kunt ook .cpp of .h voor het bestand gebruiken.
Een fout die ik maakte: Wanneer je een project opslaat onder een nieuwe naam, dan gaan alleen de bestanden mee die in de tabbladen staan. Wanneer je het oude project verwijderd, dan zijn backups zoals *.zip en documenatie verdwenen. Dus mijn backups zet ik tegenwoordig als .zip bestand in C:\Mijn documenten\Arduino en niet meer in de map van het project zelf.
Re: aanroepen van eigen code
Ok, bedankt voor de info.
Wat ik vreemd vind is dat wanneer ik een voorbeeld programma open er een aantal includes in zijn opgenomen, maar deze niet standaard in de tabbladen worden geopend.
Omdat er nogal wat bestanden worden aangeroepen wil ik blanco beginnen om duidelijk te zien welke scrts er allemaal actief zijn.
in het voorbeeld script staan er ook includes en doe bestanden staan niet in mijn project directory, maar worden wel degelijk aangeroepen bij het compileren.
Dat is om inzicht te krijgen niet erg handig.
Hoe weet ik dat er alleen bestanden worden aangeroepen die in mijn project directory staan ?
Een afwijkende naam geven waarschijnlijk
Wat ik vreemd vind is dat wanneer ik een voorbeeld programma open er een aantal includes in zijn opgenomen, maar deze niet standaard in de tabbladen worden geopend.
Omdat er nogal wat bestanden worden aangeroepen wil ik blanco beginnen om duidelijk te zien welke scrts er allemaal actief zijn.
in het voorbeeld script staan er ook includes en doe bestanden staan niet in mijn project directory, maar worden wel degelijk aangeroepen bij het compileren.
Dat is om inzicht te krijgen niet erg handig.
Hoe weet ik dat er alleen bestanden worden aangeroepen die in mijn project directory staan ?
Een afwijkende naam geven waarschijnlijk
Re: aanroepen van eigen code
Wanneer je een *.h bestand van een bibliotheek niet include, dan wordt die bibliotheek niet meegenomen in de uiteindelijke code.
De Arduino IDE heeft een aantal bibliotheken al bij zich. Zoals de Serial, Wire, EEPROM, Ethernet, Stepper.
En daarnaast heeft de Arduino IDE functies die niet in een bibliotheek zitten, maar er toch bijhoren: digitalWrite, pinMode, enzovoorts.
En vervolgens heeft de avr-gcc compiler nog allerlei functies, zoals: memset, itoa, strcpy, enzovoorts.
Een bibliotheek wordt nooit naar je eigen project gekopieerd. Dus wanneer je een #include gebruikt voor *.h bestand van een bibliotheek, dan komen er geen tabbladen bij in je project.
In het menu: Bestand / Voorkeuren, daar kun je uitgebreide uitvoer aangeven voor compilatie. Dan zie dat de compiler soms meerdere dezelfde bibliotheken tegenkomt, en er dan eentje kiest.
Wanneer je zelf code aan je project toevoegd die ook als bibliotheek bestaat, dan kun je die inderdaad beter een andere naam geven. Maar meestal gaat het goed, omdat de #include verschilt.
De Arduino functies zoals digitalWrite(), die staan als broncode bij de Arduino bestanden, en die worden net zoals je eigen project gecompileerd.
De Arduino IDE wordt steeds vernieuwd en de bibliotheken worden steeds vernieuwd. Dus het lijkt soms op balanceren op een 3 ijsschotsen tegelijk. In de praktijk valt het mee, maar soms zal je wel eens iets moeten wijzigen in je code.
Ik hoop dat het duidelijker wordt, het lijkt alsof we het over twee verschillende dingen hebben.
Blanco beginnen gaat niet. Met een lege setup() en een lege loop() heeft Arduino toch al allerlei dingen alvast goed gezet. Er loopt bijvoorbeeld een timer die gebruikt wordt voor millis().
Wat dacht je van de bootloader ? De bootloader van een Arduino Leonardo of Micro is waarschijnlijk al vele malen ingewikkelder dan de sketch. Die heeft dus al gedraaid, zodra de Arduino aangezet wordt.
De Arduino IDE heeft een aantal bibliotheken al bij zich. Zoals de Serial, Wire, EEPROM, Ethernet, Stepper.
En daarnaast heeft de Arduino IDE functies die niet in een bibliotheek zitten, maar er toch bijhoren: digitalWrite, pinMode, enzovoorts.
En vervolgens heeft de avr-gcc compiler nog allerlei functies, zoals: memset, itoa, strcpy, enzovoorts.
Een bibliotheek wordt nooit naar je eigen project gekopieerd. Dus wanneer je een #include gebruikt voor *.h bestand van een bibliotheek, dan komen er geen tabbladen bij in je project.
In het menu: Bestand / Voorkeuren, daar kun je uitgebreide uitvoer aangeven voor compilatie. Dan zie dat de compiler soms meerdere dezelfde bibliotheken tegenkomt, en er dan eentje kiest.
Wanneer je zelf code aan je project toevoegd die ook als bibliotheek bestaat, dan kun je die inderdaad beter een andere naam geven. Maar meestal gaat het goed, omdat de #include verschilt.
- Code: Alles selecteren
#include <Ethernet.h>
#include "voorbeeld.h"
De Arduino functies zoals digitalWrite(), die staan als broncode bij de Arduino bestanden, en die worden net zoals je eigen project gecompileerd.
De Arduino IDE wordt steeds vernieuwd en de bibliotheken worden steeds vernieuwd. Dus het lijkt soms op balanceren op een 3 ijsschotsen tegelijk. In de praktijk valt het mee, maar soms zal je wel eens iets moeten wijzigen in je code.
Ik hoop dat het duidelijker wordt, het lijkt alsof we het over twee verschillende dingen hebben.
Blanco beginnen gaat niet. Met een lege setup() en een lege loop() heeft Arduino toch al allerlei dingen alvast goed gezet. Er loopt bijvoorbeeld een timer die gebruikt wordt voor millis().
Wat dacht je van de bootloader ? De bootloader van een Arduino Leonardo of Micro is waarschijnlijk al vele malen ingewikkelder dan de sketch. Die heeft dus al gedraaid, zodra de Arduino aangezet wordt.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: aanroepen van eigen code
En dan heb je nog niet eens over alle libraries daar weer achter van avr
Re: aanroepen van eigen code
Bedankt voor de uitgebreide toelichting.
Het is ontzettend handig dat er al heel veel zaken geregeld zijn en daar wil ik ook zeker gebruik van maken. echter als voorbeeld, ik heb nu een Uno bordje met een ESP8266 Wifi chip erop zitten.
Daarnaast heb ik een SD kaart lezertje aangesloten. Nu is er een kant en klare code beschikbaar om dit allemaal aan te sturen en een webserver te maken waarbij de content op de SD kaart staat.
Alleen nu wil ik in plaats van een IP adres via DHCP een statisch IP adres hebben. toen raakte ik de draad kwijt.
Als ik het goed begrijp moet ik 1 van die bibliotheken naar mijn project folder kopieren, hem aanpassen en dan aanroepen zoals in jouw voorbeeld met #include "voorbeeld.h" ?
welke bibliotheek moet ik daarvoor hebben en welke code heb ik nodig voor een statisch IP adres ?
Het is ontzettend handig dat er al heel veel zaken geregeld zijn en daar wil ik ook zeker gebruik van maken. echter als voorbeeld, ik heb nu een Uno bordje met een ESP8266 Wifi chip erop zitten.
Daarnaast heb ik een SD kaart lezertje aangesloten. Nu is er een kant en klare code beschikbaar om dit allemaal aan te sturen en een webserver te maken waarbij de content op de SD kaart staat.
Alleen nu wil ik in plaats van een IP adres via DHCP een statisch IP adres hebben. toen raakte ik de draad kwijt.
Als ik het goed begrijp moet ik 1 van die bibliotheken naar mijn project folder kopieren, hem aanpassen en dan aanroepen zoals in jouw voorbeeld met #include "voorbeeld.h" ?
welke bibliotheek moet ik daarvoor hebben en welke code heb ik nodig voor een statisch IP adres ?
Re: aanroepen van eigen code
Het is zelden nodig om een bibliotheek te wijzigen, tenzij er fouten in zitten of je zou heel speciale dingen willen doen.
Kun je de sketch laten zien ? En kun je vertellen welke bibliotheek je gebruikt ? Dan is het even zoeken hoe die bibliotheek gebruikt wordt om een statisch IP adres te kiezen.
Vaak is het mogelijk om in de router een lijst te maken van statische IP adressen. In mijn Arduino laat ik DHCP aan staan, maar mijn router geeft het een vast IP adres.
Kun je de sketch laten zien ? En kun je vertellen welke bibliotheek je gebruikt ? Dan is het even zoeken hoe die bibliotheek gebruikt wordt om een statisch IP adres te kiezen.
Vaak is het mogelijk om in de router een lijst te maken van statische IP adressen. In mijn Arduino laat ik DHCP aan staan, maar mijn router geeft het een vast IP adres.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: aanroepen van eigen code
Er was ooit een probleem met die lib maar dat was in april vorig jaar. Even googelen.... en je had het geweten.
https://github.com/esp8266/Arduino/issues/1959
Als je niet ruim onderricht bent zou ik niet zomaar een library aanpassen. En er is maar EEN plaats waar jij non standard Arduino libraries moet zetten en dat is in "mijn documenten/Arduino/libraries
Doe het vooral niet op andere plekken tenzij je de diepte in kan.
https://github.com/esp8266/Arduino/issues/1959
Als je niet ruim onderricht bent zou ik niet zomaar een library aanpassen. En er is maar EEN plaats waar jij non standard Arduino libraries moet zetten en dat is in "mijn documenten/Arduino/libraries
Doe het vooral niet op andere plekken tenzij je de diepte in kan.
Re: aanroepen van eigen code
Hieronder de standaard code (1 van de voorbeeld programma's in de Arduino IDE) die ik gebruik voor de wifi adapter, sd kaart en webserver.
Ik weet dat het mogelijk is om een reservering te maken in een dhcp server, maar om wat meer feeling te krijgen met de arduino programma's wil ik juist hier een aanpassing in maken om een statisch ip adres in te stellen. enig advies hoe ik dit kan realiseren ?
cpp code
Ik weet dat het mogelijk is om een reservering te maken in een dhcp server, maar om wat meer feeling te krijgen met de arduino programma's wil ik juist hier een aanpassing in maken om een statisch ip adres in te stellen. enig advies hoe ik dit kan realiseren ?
cpp code
/*
SDWebServer - Example WebServer with SD Card backend for esp8266
Copyright (c) 2015 Hristo Gochkov. All rights reserved.
This file is part of the ESP8266WebServer library for Arduino environment.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Have a FAT Formatted SD Card connected to the SPI port of the ESP8266
The web root is the SD Card root folder
File extensions with more than 3 charecters are not supported by the SD Library
File Names longer than 8 charecters will be truncated by the SD library, so keep filenames shorter
index.htm is the default index (works on subfolders as well)
upload the contents of SdRoot to the root of the SDcard and access the editor by going to http://esp8266sd.local/edit
*/
#include <ESP8266WiFi.h>
#include <WiFiClient-p.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <SPI.h>
#include <SD.h>
#define DBG_OUTPUT_PORT Serial
const char* ssid = "wifissid";
const char* password = "123123123";
const char* host = "esp8266sd";
ESP8266WebServer server(80);
static bool hasSD = false;
File uploadFile;
void returnOK() {
server.send(200, "text/plain", "");
}
void returnFail(String msg) {
server.send(500, "text/plain", msg + "\r\n");
}
bool loadFromSdCard(String path){
String dataType = "text/plain";
if(path.endsWith("/")) path += "index.htm";
if(path.endsWith(".src")) path = path.substring(0, path.lastIndexOf("."));
else if(path.endsWith(".htm")) dataType = "text/html";
else if(path.endsWith(".css")) dataType = "text/css";
else if(path.endsWith(".js")) dataType = "application/javascript";
else if(path.endsWith(".png")) dataType = "image/png";
else if(path.endsWith(".gif")) dataType = "image/gif";
else if(path.endsWith(".jpg")) dataType = "image/jpeg";
else if(path.endsWith(".ico")) dataType = "image/x-icon";
else if(path.endsWith(".xml")) dataType = "text/xml";
else if(path.endsWith(".pdf")) dataType = "application/pdf";
else if(path.endsWith(".zip")) dataType = "application/zip";
File dataFile = SD.open(path.c_str());
if(dataFile.isDirectory()){
path += "/index.htm";
dataType = "text/html";
dataFile = SD.open(path.c_str());
}
if (!dataFile)
return false;
if (server.hasArg("download")) dataType = "application/octet-stream";
if (server.streamFile(dataFile, dataType) != dataFile.size()) {
DBG_OUTPUT_PORT.println("Sent less data than expected!");
}
dataFile.close();
return true;
}
void handleFileUpload(){
if(server.uri() != "/edit") return;
HTTPUpload& upload = server.upload();
if(upload.status == UPLOAD_FILE_START){
if(SD.exists((char *)upload.filename.c_str())) SD.remove((char *)upload.filename.c_str());
uploadFile = SD.open(upload.filename.c_str(), FILE_WRITE);
DBG_OUTPUT_PORT.print("Upload: START, filename: "); DBG_OUTPUT_PORT.println(upload.filename);
} else if(upload.status == UPLOAD_FILE_WRITE){
if(uploadFile) uploadFile.write(upload.buf, upload.currentSize);
DBG_OUTPUT_PORT.print("Upload: WRITE, Bytes: "); DBG_OUTPUT_PORT.println(upload.currentSize);
} else if(upload.status == UPLOAD_FILE_END){
if(uploadFile) uploadFile.close();
DBG_OUTPUT_PORT.print("Upload: END, Size: "); DBG_OUTPUT_PORT.println(upload.totalSize);
}
}
void deleteRecursive(String path){
File file = SD.open((char *)path.c_str());
if(!file.isDirectory()){
file.close();
SD.remove((char *)path.c_str());
return;
}
file.rewindDirectory();
while(true) {
File entry = file.openNextFile();
if (!entry) break;
String entryPath = path + "/" +entry.name();
if(entry.isDirectory()){
entry.close();
deleteRecursive(entryPath);
} else {
entry.close();
SD.remove((char *)entryPath.c_str());
}
yield();
}
SD.rmdir((char *)path.c_str());
file.close();
}
void handleDelete(){
if(server.args() == 0) return returnFail("BAD ARGS");
String path = server.arg(0);
if(path == "/" || !SD.exists((char *)path.c_str())) {
returnFail("BAD PATH");
return;
}
deleteRecursive(path);
returnOK();
}
void handleCreate(){
if(server.args() == 0) return returnFail("BAD ARGS");
String path = server.arg(0);
if(path == "/" || SD.exists((char *)path.c_str())) {
returnFail("BAD PATH");
return;
}
if(path.indexOf('.') > 0){
File file = SD.open((char *)path.c_str(), FILE_WRITE);
if(file){
file.write((const char *)0);
file.close();
}
} else {
SD.mkdir((char *)path.c_str());
}
returnOK();
}
void printDirectory() {
if(!server.hasArg("dir")) return returnFail("BAD ARGS");
String path = server.arg("dir");
if(path != "/" && !SD.exists((char *)path.c_str())) return returnFail("BAD PATH");
File dir = SD.open((char *)path.c_str());
path = String();
if(!dir.isDirectory()){
dir.close();
return returnFail("NOT DIR");
}
dir.rewindDirectory();
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
server.send(200, "text/json", "");
WiFiClient client = server.client();
server.sendContent("[");
for (int cnt = 0; true; ++cnt) {
File entry = dir.openNextFile();
if (!entry)
break;
String output;
if (cnt > 0)
output = ',';
output += "{\"type\":\"";
output += (entry.isDirectory()) ? "dir" : "file";
output += "\",\"name\":\"";
output += entry.name();
output += "\"";
output += "}";
server.sendContent(output);
entry.close();
}
server.sendContent("]");
dir.close();
}
void handleNotFound(){
if(hasSD && loadFromSdCard(server.uri())) return;
String message = "SDCARD Not Detected\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " NAME:"+server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
DBG_OUTPUT_PORT.print(message);
}
void setup(void){
DBG_OUTPUT_PORT.begin(115200);
DBG_OUTPUT_PORT.setDebugOutput(true);
DBG_OUTPUT_PORT.print("\n");
WiFi.begin(ssid, password);
DBG_OUTPUT_PORT.print("Connecting to ");
DBG_OUTPUT_PORT.println(ssid);
// Wait for connection
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++ < 20) {//wait 10 seconds
delay(500);
}
if(i == 21){
DBG_OUTPUT_PORT.print("Could not connect to");
DBG_OUTPUT_PORT.println(ssid);
while(1) delay(500);
}
DBG_OUTPUT_PORT.print("Connected! IP address: ");
DBG_OUTPUT_PORT.println(WiFi.localIP());
if (MDNS.begin(host)) {
MDNS.addService("http", "tcp", 80);
DBG_OUTPUT_PORT.println("MDNS responder started");
DBG_OUTPUT_PORT.print("You can now connect to http://");
DBG_OUTPUT_PORT.print(host);
DBG_OUTPUT_PORT.println(".local");
}
server.on("/list", HTTP_GET, printDirectory);
server.on("/edit", HTTP_DELETE, handleDelete);
server.on("/edit", HTTP_PUT, handleCreate);
server.on("/edit", HTTP_POST, [](){ returnOK(); }, handleFileUpload);
server.onNotFound(handleNotFound);
server.begin();
DBG_OUTPUT_PORT.println("HTTP server started");
if (SD.begin(SS)){
DBG_OUTPUT_PORT.println("SD Card initialized.");
hasSD = true;
}
}
void loop(void){
server.handleClient();
}
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: aanroepen van eigen code
Ik geef je net een link en daar staat verderop hoe het moet. En dan in de setup
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 23 gasten