Forum: Mikrocontroller und Digitale Elektronik Code einbinden Arduino / ESP8266


von A. D. (anmalo)


Lesenswert?

Mit dem Vs2019 kann ich dateien einbinden und als variable im code 
benutzen.

Geht das für Arduino oder ESP8266 auch?

Ich habe nur das gefunden:
1
const char* s = R"EOL(...)EOL";

Wobei ich möchte, dass die ... durch eine externe Datei ersetzt werden 
die dann beim compilieren in diese variable eingebunden wird ohne das 
ich bei jeder änderung die "Datei" in Text umwandeln muss.

Ich benutze VS2019 mit VMicro (lizensiert).

von Einer K. (Gast)


Lesenswert?

A. D. schrieb:
> Mit dem Vs2019 kann ich dateien einbinden und als variable im code
> benutzen.

Wie tust du das?

Warum sollte das mit der Arduino IDE nicht gehen?
Welche Meldungen kommen da?

von Stefan F. (Gast)


Lesenswert?

Irgendwie konnte man das mit objcopy machen. Man wandelt die Datei ins 
*.o Format um und linkt sie dann zum Binary hinzu. Irgendwann in den 
90ern hatte ich das mal gemacht.

Eine einfachere Alternative ist, die Datei mittels
1
xxd -i Dateiname > dateiname.c
in ganz normalen C-Quelltext umzuwandeln. Das kann man prima ins 
Makefile einbinden. Nur nicht unter dem Spiele-Starter Windows, aber das 
ist ja auch für eine andere Zielgruppe vorgesehen. Siehe dazu 
https://www.cygwin.com/

von A. D. (anmalo)


Lesenswert?

in C# kann ich die Dateien als Resource einbinden, im EXE kann ich diese 
dann verwenden aber nicht ändern. Ideal für ICONEN, Bilder oder Keys.

Leider sind in Arduino keine Ressource Library vorhanden.

Klar kann ich die mit xxd oder anders umwandeln und dann einbinden.
Das Problem ist aber man muss das jedesmal machen wenn die einzubindende 
Datei ändert. Mir wäre lieber ich könnte das ohne vorherige Umwandlung.

die Funktion mit R"EOL(...)EOL" funzt leider auch nicht.
Vermutlich nur mit anderen IDE's...

Ansonsten schreib ich halt schnell ein Programm welches die Dateien in 
ein Header umwandelt, dann kann ich die Includen... aber ist halt wieder 
mehr aufwand.

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

A. D. schrieb:
> Ansonsten schreib ich halt schnell ein Programm welches die Dateien in
> ein Header umwandelt, dann kann ich die Includen... aber ist halt wieder
> mehr aufwand.

"Dateien" wie in "mehrere"?
Warum nimmst du nicht "FS.h", also SPIFFS oder LittleFS, und packst die 
Dateien as-is auf den ESP?
Grade für so Web-Server Anwendungen ist das oft viel praktischer.

von Einer K. (Gast)


Lesenswert?

A. D. schrieb:
> die Funktion mit R"EOL(...)EOL" funzt leider auch nicht.
> Vermutlich nur mit anderen IDE's...

Das tuts schon mit der Literal Form.
Aber es lassen sich kein unmodifizierten Textdateien einblenden.

Man kann sich behelfen.....
Die Textdatei endet bei mir auf *.h, damit sie mit der Arduino IDE 
erzeugt und bearbeitet werden kann

test.h
1
R"EOL(
2
Lorem ipsum dolor sit amet consectetuer et semper id augue a. 
3
Turpis Aenean dolor elit neque Sed Maecenas vel volutpat 
4
condimentum consequat. Egestas nisl malesuada Duis eu orci 
5
malesuada pulvinar justo pretium et. Tempus elit lacus 
6
interdum nec non tempus sit amet Fusce elit. Leo tellus 
7
eleifend tellus mauris laoreet tellus et cursus massa eget. 
8
Et mauris lacus nec mauris semper et vel.
9
)EOL"


irgendwas.ino
1
#include <Streaming.h> // die Lib findest du selber ;-)
2
3
4
5
using FlashStr = const __FlashStringHelper *;
6
7
const char teststring[] PROGMEM = 
8
#include "test.h" 
9
;
10
11
FlashStr lorem = reinterpret_cast<FlashStr>(teststring);
12
13
14
void setup() 
15
{
16
  Serial.begin(9600);
17
18
  Serial << FlashStr(teststring) << endl;
19
  
20
  Serial << lorem << endl;
21
}
22
23
void loop() 
24
{
25
26
}

von A. D. (anmalo)


Lesenswert?

@Arduino Fanboy D. (ufuf)
Hi Danke für die schnelle Antwort.

"R"EOL..." funktioniert soweit mit direktem Text,
jedoch auf den Trick mit dem include wäre ich nicht gekommen
(ist aber ja logisch, hab wohl zu weit gesucht und war verblendet vom 
Resource C#).

Das ist für mich genau die richtige Lösung.
Danke, das spart mir eine menge Arbeit.

@Εrnst B. (ernst)
Danke, aber hab keine SDCARD und möchte lieber alles im Code.

von Einer K. (Gast)


Lesenswert?

Schön, dass es dir gefällt!

Auch wenn sich bei dem ein oder anderem Arduino oder C++ Hasser die 
Nackenhärchen dabei aufstellen werden.

von Stefan F. (Gast)


Lesenswert?

A. D. schrieb:
> Das Problem ist aber man muss das jedesmal machen wenn die einzubindende
> Datei ändert.

Deswegen benutzt man Build Scripte die das automatisieren. Das gute alte 
Make würde die Umwandlung sogar nur dann ausführen, wenn notwendig, also 
wenn die Quelldatei geändert wurde.

von A. D. (anmalo)


Lesenswert?

Arduino Fanboy D. schrieb:
> Schön, dass es dir gefällt!
>
> Auch wenn sich bei dem ein oder anderem Arduino oder C++ Hasser die
> Nackenhärchen dabei aufstellen werden.

Ja ging mir zuerst auch so, jedoch mit der Zeit ist man mit wenig schon 
zufrieden, werde es aber im Auge gehalten...

von Εrnst B. (ernst)


Lesenswert?

A. D. schrieb:
> Danke, aber hab keine SDCARD und möchte lieber alles im Code.

Beim ESP geht das im internen Flash, ganz ohne SD-Card.

https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html

d.H. du hast da sowieso 1-3 MB an Flash, die sonst ungenutzt bleiben 
würden. (ok, bei den ganz alten ESP-01 sind's nur 64k)

und dem Webserver erklärst du dann mit z.B.
1
  server.serveStatic("/", SPIFFS, "/htdocs/").setDefaultFile("index.html");
wo und wie er seine HTML/CSS/JS/Bild-Dateien findet.

Aber: ist nur ein Vorschlag, musst du natürlich nicht so machen.

: Bearbeitet durch User
von A. D. (anmalo)


Lesenswert?

Εrnst B. schrieb:
> Beim ESP geht das im internen Flash, ganz ohne SD-Card.

Ja danke, mit dem ESP steh ich erst am Anfang, habe mal ein WiFiLogger 
geschrieben für dem MegaR3WiFi.

Dann kahm die Idee warum nicht gleich ein Web Server zu machen wo man 
das Ergebnis sofort ablesen kann ohne über ein Protokoll und Zusatz 
Programm zugehen.

Werde das sicher noch anschauen wäre ja vermutlich dann auch die 
richtigere Variante, Besten Dank.

von A. D. (anmalo)


Lesenswert?

Εrnst B. schrieb:
>
1
>   server.serveStatic("/", SPIFFS, 
2
> "/htdocs/").setDefaultFile("index.html");
3
>

ist auch veraltet, serverStatic ist VOID und setDefaultFile ist im 
nirwana
genau wie SPIFFS

Leider veraltet und darduch unzählige Warnungen.
Stellt man auf LittleFS um funzt alles, jedoch können keine Daten 
hochgeladen werden weil das Tool einen Fehler in der IDE Anzeigt.
Zudem ist das Git Library unvollständig und enthält kein .jar das muss 
man sich nach stunden durchlesen selber noch besorgen...
Unfertig und unausgereift und fehlerhaft.

Etwas schwach und unausgereift das ganze...
(Meine Meinung, 1 Tag verloren)

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

A. D. schrieb:
> serverStatic ist VOID

Nein, da kommt ein AsyncStaticWebHandler zurück.
1
AsyncStaticWebHandler& serveStatic(const char* uri, fs::FS& fs, const char* path, const char* cache_control = NULL);

und dieser bietet eine Methode
1
AsyncStaticWebHandler& setDefaultFile(const char* filename);


A. D. schrieb:
> genau wie SPIFFS

die serve-Static Methode nimmt ein fs::FS-Objekt. Davon sind sowohl 
SPIFFS als auch LittleFS abgeerbt, d.H. es geht beides.

A. D. schrieb:
> und enthält kein .jar

Häh? Was willst du mit einem JAR? Das ist C++, kein Java.



Du hast schon die richtige Bibliothek?
https://github.com/me-no-dev/ESPAsyncWebServer/

(platformio.ini:
1
[platformio]
2
data_dir = htdocs
3
[env]
4
platform = ...
5
board = ...
6
framework = arduino
7
board_build.filesystem = littlefs
8
lib_deps = ESP Async WebServer
)

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Εrnst B. schrieb:
> Häh? Was willst du mit einem JAR? Das ist C++, kein Java.

Für SPIFFS gibts ein Arduino IDE Plugin/Tool  (eine *.jar Datei) um das 
FS zu füllen/Initialisieren. Denn die IDE ist sehr wohl ein Java 
Programm.

von Εrnst B. (ernst)


Lesenswert?

Arduino Fanboy D. schrieb:
> Denn die IDE ist sehr wohl ein Java
> Programm.

Ok, diese Krankheit benutz' ich nicht. Und der muss man ein JAR 
mitgeben, damit sie das Dateisystem erzeugen kann? Das ist dann 
tatsächlich unpraktisch.

Damit stellt sich dann eine neue Frage: wieso kommt der TE auf die Idee, 
dass eine Webserver-Bibliothek ein Tool zum Dateisystem-Erstellen 
mitliefern sollte? Das wär dann doch deutlich out-of-scope.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Εrnst B. schrieb:
> Und der muss man ein JAR
> mitgeben, damit sie das Dateisystem erzeugen kann?

Das ist eine Folge dessen, dass die ESP Boards Fremdboards sind. Da muss 
halt der Ersteller der Boarddefinition alle notwendigen Tools 
mitliefern.


Εrnst B. schrieb:
> Das ist dann
> tatsächlich unpraktisch.
Mag sein...
Es ist dennoch keine Schwäche der IDE, eher eine der Boarddefinition.

von Εrnst B. (ernst)


Lesenswert?

Arduino Fanboy D. schrieb:
> Da muss
> halt der Ersteller der Boarddefinition alle notwendigen Tools
> mitliefern.

Ok, d.H. es ist kein Problem der Webserver-Bibliothek, sondern ein 
Problem des ESP32-Arudino-IDE-Plugins.


Nachdem der TE scheinbar ein VisualStudio-User (wohl VS2019, nicht 
VScode) ist: Vielleicht sollte er bei dieser IDE bleiben. Da kriegt er 
platformio eingebunden, und das regelt die ganzen Tool- und 
Bibliotheksabhängigkeiten, wie auch das Dateisystem-Erstellen und 
Dateisystem-Upload...

https://docs.platformio.org/en/latest/integration/ide/visualstudio.html

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.