aanroepen van eigen code

IDE gerelateerde berichten
Berichten: 28
Geregistreerd: 14 Jan 2017, 17:43

aanroepen van eigen code

Berichtdoor Piet200 » 17 Jan 2017, 23:02

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.

Advertisement

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

Re: aanroepen van eigen code

Berichtdoor Koepel » 17 Jan 2017, 23:40

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.

Berichten: 28
Geregistreerd: 14 Jan 2017, 17:43

Re: aanroepen van eigen code

Berichtdoor Piet200 » 17 Jan 2017, 23:53

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

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

Re: aanroepen van eigen code

Berichtdoor Koepel » 18 Jan 2017, 00:26

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.
Code: Alles selecteren
#include <Ethernet.h>
#include "voorbeeld.h"
De eerste regel is een bibliotheek, de twee regel is een include voor een *.h bestand in je eigen project.

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.

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

Re: aanroepen van eigen code

Berichtdoor nicoverduin » 18 Jan 2017, 00:57

En dan heb je nog niet eens over alle libraries daar weer achter van avr
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 28
Geregistreerd: 14 Jan 2017, 17:43

Re: aanroepen van eigen code

Berichtdoor Piet200 » 18 Jan 2017, 19:49

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 ?

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

Re: aanroepen van eigen code

Berichtdoor Koepel » 18 Jan 2017, 19:58

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.

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

Re: aanroepen van eigen code

Berichtdoor nicoverduin » 18 Jan 2017, 21:00

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 28
Geregistreerd: 14 Jan 2017, 17:43

Re: aanroepen van eigen code

Berichtdoor Piet200 » 18 Jan 2017, 21:33

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
/*
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://"&#41;;
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();
}

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

Re: aanroepen van eigen code

Berichtdoor nicoverduin » 18 Jan 2017, 21:55

Ik geef je net een link en daar staat verderop hoe het moet. En dan in de setup
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten