PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zusammstellung: GPS + WiFi + 7-Segment 4-Digit LCD



TFlow
01.12.2017, 14:31
Hallo zusammen,

für ein Projekt benötige ich ein Board, welches per WLAN einen HTTP-Request mit seinen GPS-Koordinaten abgibt und das Ergebnis (0.001 bis 9999) auf ein 7-Segment 4-Digit LCD wiedergibt. Da ich ein absoluter Anfänger bin, würde ich mich freuen, wenn Ihr mir bei der Auswahl der Teile helfen könnt. Die Programmierung werde ich selbst hinbekommen.

Als erstes stellt sich die Frage nach dem richtigen Mikrocontroller. Mit dem NodeMCU habe ich die Erfahrung gemacht, dass hierfür evtl. zu wenig PINs zur Verfügung stehen. (s. https://www.roboternetz.de/community/threads/71377-Anf%C3%A4ngerproblem-Pin-Layout-NodeMCU)

Wie ich das sehe benötige ich:

Microcontroller
WiFi-Modul
GPS-Sensor
Batterie + Clip
7-Segment 4-Digit LCD
Kabel und Widerstände


Ich bin für jede Hilfe dankbar!

TFlow

piggituX
03.12.2017, 00:19
Hi,

generell solltest du erstmal schauen Ein und Ausgangs Pins du insgesamt brauchst.

GPS Modul
7 Segment
Logging (SDCard)
RTC modul



ich persönlich würde vermutlich nen Raspberry Pi nehmen mit USB WLAN Modul, der hat genug GPIO für alle anderen Sachen. Bist dann offen für die Art der Programmierung.

Powerbank mit genug Kapazität oder nen Lipo nur dann brauchst du noch ne Schaltung auf 5 V für den Pi
Frage ist natürlich wie lange es laufen muss.

GPS Sensor deiner Wahl
7Segment deiner Wahl

Aber Raspi GPIO sind nur 3,3V musst du dann bei den Modueln aufpassen oder noch einen Level Shifter berücksichtigen.

Wenn du das mit nem MC machen willst....

Uno zB.

Conrad -> 1387029-82 (Eval Board Arduino Nano compatible)
Conrad -> 323476-62 (Arduino Wireless SD Shield) fehlt noch das WLAN Modul

so als Gedankenanstoß

TFlow
04.12.2017, 14:51
Hallo pig,

vielen Dank für deine Antwort. Ich habe die Idee noch einmal überdacht und bin zu dem Entschluss gekommen, dass ich das ganze stationär aufbauen werde. Damit entfallen der GPS-Sensor und der Batterie-Anschluss. Was übrig bleibt ist das 7-segment 4-digit LED und die Steuerung hierfür. Wie beschrieben, möchte ich auf dem Display eine Zahl zwischen 0.001 und 9999 darstellen, welche ich über einen HTTP-Aufruf bekomme. Bei Eckstein habe ich verschiedene 7-Segmenter gefunden, teilweise mit eigenem Mikrocontroller (für die bessere/leichtere Ansteuerung?) - damit sollten weniger PINs benötigt werden, wenn ich das richtig verstanden habe.
Könntest du mir mit diesen neuen Infos noch einmal einen Tipp geben, wie ich das ganze möglichst einfach realisieren kann?

Vielen Dank!

Edit: Der Link zu Eckstein: https://eckstein-shop.de/LED-Segmentanzeigen

Ceos
04.12.2017, 15:07
möchte ich auf dem Display eine Zahl zwischen 0.001 und 9999 darstellen, welche ich über einen HTTP-Aufruf bekomme

du willst also auf dem gerät einen mikro webserver der per http-get mit parametern eine zahl entgegen nimmt und diese auf deinem 7-segment ausgibt

Ein 7-segment hat i.d.R. 7 segmente + 1 Punkt, also 8 LEDs, die üblicherweise in einer matrix angesteuert werden und eine gemeinsame masse haben.

Beste Lösung wäre es wenn du also 8 Pins für segmente nimmst und 4 pins für die ziffern und dann multiplexing betriebst, du benötigst also einen controller mit mindestens 12 freien portpins oder du sparst dir 7-8 pins und nimmst eines der 7 segmentanzeigen mit schieberegistern und steuert das ganze dann per I2C oder SPI an, je nachdem wo du dich noch am ehesten rantraust :)

mit multiplexing meine ich, du steuerst hintereinander immer jeweils einen masse pin an, so dass immer nur eine ziffer zur selben zeit an ist und je nachdem welche ziffer an ist, schaltest du die entsprechenden segmente ein um das gewünschte zeichen darzustellen

das durchschalten der ziffern passiert dann über eine schleife so schnell, dass das träge auge alle 4 zeichen simultan wahrnehmen kann

TFlow
04.12.2017, 15:41
du willst also auf dem gerät einen mikro webserver der per http-get mit parametern eine zahl entgegen nimmt und diese auf deinem 7-segment ausgibt

Ganz genau. Der Serverseitige Part steht auch bereits.

Ich bin leider elektrotechnisch nicht bewandert daher mal eine vielleicht dumme Frage: Kann ich mir die Pins mehr oder weniger aussuchen? Auf dem UNO R3 habe ich das Display gerade nach einem Tutorial zum Laufen bekommen. Jetzt würde ich das gerne auf das NodeMCU ummünzen. Und was sagst du zu den 7-Segmentern mit eigenem Mikrocontroller? (Eckstein-Link)

Edit:
Spricht eigentlich etwas gegen die Kombi "WeMos D1" + "ProtoShield mit Display"?

WeMos D1: https://eckstein-shop.de/WeMos-D1-Development-Board-mit-ESP8266-ESP-12E-WIFI-Modul-Arduino-IDE-UNO
ProtoShield: https://eckstein-shop.de/Arduino-Multi-Function-Shield-ProtoShield-fuer-Arduino

Das würde mir als Anfänger die lästige Verkabelung ersparen und ist preislich denke ich im Rahmen. Was denkst du/ihr?

Ceos
04.12.2017, 17:13
von denen mit controller habe ich 0 plan, aber mit LED 7 segment hab ich grade auf arbeit ein projekt beendet, es sind halt 12 pins die wegfallen

da du arduino einsetzt sind die pins völlig egal, ich habe mir halt eine tabelle mit den segmentkombinationen für die zahlen gemacht (programmiere bare metal) und dann über den index einfach an einen port vom controller kopiert, so muss ich die beinchen nicht einzeln setzen sondern mache einfach nur eine zuweisung PORTy = digit; digit<<=1; (0b0001, 0b0010, 0b0100 und 0b1000) PORTx = lookup[0]; für eine "0" oder eben lookup[1] für eine "1", bei meiner anwendung kommt es auf geschwindigkeit an (weil industriesensor) bei dir kannst du es bauen wie es dir beliebt :)

piggituX
05.12.2017, 00:07
Hi,

was hälst du denn von dieser Idee, hab ich heute abend mal schnell zusammengestrickt. Oder muss es unbedingt 7 Segment sein ;-)


http://piggitux.ignorelist.com:8085/NodeMCU_OLED_x264.mp4

33100

Ceos
05.12.2017, 07:35
entweder die middlebox blockt deine seite oder deine seite mag mich nicht :P

TFlow
05.12.2017, 09:24
Erstmal danke für die Antworten! Den 7-Segmenter habe ich mir ausgesucht, weil das Display relativ groß ist bzw. die Zahl dann auch von weiter weg gelesen werden kann.

@Ceos:

da du arduino einsetzt sind die pins völlig egal, ich habe mir halt eine tabelle mit den segmentkombinationen für die zahlen gemacht (programmiere bare metal) und dann über den index einfach an einen port vom controller kopiert, so muss ich die beinchen nicht einzeln setzen sondern mache einfach nur eine zuweisung PORTy = digit; digit<<=1; (0b0001, 0b0010, 0b0100 und 0b1000) PORTx = lookup[0]; für eine "0" oder eben lookup[1] für eine "1", bei meiner anwendung kommt es auf geschwindigkeit an (weil industriesensor) bei dir kannst du es bauen wie es dir beliebt

Das klingt gut! Heißt das, dass du nur ein Kabel verwendest und die Infos digital über einen Pin eingibst? Ich habe mal fett markiert, was ich nicht wirklich verstehe \\:D/

piggituX
05.12.2017, 09:27
Moin,

is nur nen dynDNS :) habs gerade nochmal auf nem Vodafone Mobil probiert :) tut es sozusagen.

Ceos
05.12.2017, 11:22
bare metal, also ohne irgend ein framework, sondern mit dem befehlssatz des compilers für den entsprechenden chip

index ist der zeiger in einem array

port ist eine input output peripherie, pins werden üblicherweise in ports gruppiert die dann über register gesteuert werden ... pins pro port ist meist identisch mit der prozessor architektur, also 8bit prozessor = 8 pins pro port

das schreiben in ein register ist atomar, benötigt nur einen einzigen prozessorcycle/takt, das setzen von 8 pins gleichzeitig dauert als nur 1takt ... wenn cih jetzt einen einzelnen pin ändern möchte müsste ich das sog. "read-modify-write" verfahren nehmen, ich lese das register aus, verändere den pin meiner wahl und schreibe das register zurück ... also würde es mindestens 3 takte dauern (meist mehr wegen diversen mathematischen operationen um das richtige bit zu maskeiren und zu setzen) ... ich würde also für das einzelne setzen der pins mind. die 32fache (8*4takte) zeit brauchen

da du mit arduino ein framework benutzt kommt du garnicht erst auf einfachem wege an die register und hast eh keine chance ohne weiteres arbeiten die ports direkt zu steuern (zumal du dein framework verwirren würdest wenn du es machst)

0b0001 ist binärschreibweise, du schreibst das zahlenwort also bit für bit: 0b0001 wäre ein 4 bit wort (die fehlenden bits werden mit 0 aufgefüllt) und entspräche der zahl 1 0b0010 wäre ein 2 und 0b0011 eine 3 zum beispiel

ich habe bei meinem display quasi eine schleife die pro voller millisekunde folgendes macht



//uint8_t bedeutet 8bit wort ohne vorzeichen

uint8_t digit = 0b0001; //startzustand erste ziffer
uint8_t lookup[10]; //array mit segmentkombinationen für die ziffern 0-9
uint8_t digitmask = 0b01111; //ich maskiere die ungebrauchten bits aus, könnten ja noch andere komponenten dran hängen
uint8_t zifferwert = 0; //darzustellende ziffer von 0-9, ändert sich je nach ausgewähltem digit auf dem display und deiner anwendung

//das display hängt mit den segmenten an PORTx des controller und die ziffern massen jeweils an den unteren 4 bit des PORTy

...

while(TRUE) //endlossschleife im controller, darf nie enden
{
while(!1ms_timeup) nop(); //tot schleife bis 1ms zeit abgelaufen 1khz updaterate fürs display / 4 ziffern = 250hz display refresh rate
PORTy = digit;
if((digit & digitmask) == 0b01000) digit = 0b0001; //zurücksetzen wenn das letzte digit erreicht ist
else digit = digit << 1; //bitshift links um 1, damit wird aus 0b0001 z.b. 0b0010 oder daraus dann 0b0100
PORTx = lookup[ziffer]; //schiebt die segmentkombination die deiner darzustellenden ziffer entspricht in das register für die segmente
}


im code fehlt jetzt natürlich der part der ziffer mit dem ausgewählten digit im display korreliert und deinen eingegebenen zahlenwert in 4 ziffern umrechnet :)

TFlow
05.12.2017, 11:35
Danke für die ausführliche Antwort. Hängen geblieben ist bei mir, dass ich den NodeMCU nicht im bare metal Stil beschreiben kann, richtig?

Ceos
05.12.2017, 11:53
können ja, wollen eher nein, da braucht es erstmal ein bisschen erfahrung und genug langeweile um sich durch das datenblatt des controller zu wühlen, eine entwicklungsumgebung passend zum controller zu installieren (meist reicht eclipse für C programmierung), den compiler einzurichten ind er umgebung (ist einfacher wenn man die IDE des chip hersteller nimmt) und natürlich ein programmiergerät für den chip oder eine anleitung wie du das NodeMCU über USB flashen kannst wenn du ein eigenes binary compilierst.

ich erahne schon die vielen fragezeichen und rate erstmal zu kleineren schritten mit arduino :)

später suchst du dir dann mal einen blog oder ein how-to wie man eben mit hilfe von arduino eben bare-metal programmiert und das board damit bespielt, das ist etwas komplizierter und erfordert eine etwas ausschweifende anleitung

TFlow
05.12.2017, 13:47
Haha, ok. Aber ich suche ja eigentlich eine möglichst einfache Art, das selbst herzustellen. Ich habe dieses Teil gefunden, welches scheinbar nur 3 Steckplätze benötigt: https://eckstein-shop.de/8-Digit-LED-Display-Digital-Tube-Red-74HC595-for-Arduino
Weiß du, ob das mit dem NodeMCU kompatibel ist? Damit sollte ich dann doch auf einfache Art und Weise die Zahl ausgeben können.

HaWe
05.12.2017, 13:53
bei nodeMCU kann man von vornherein NIE sicher sen, ob angeschlossene Geräte auf Anhieb funktionieren wie bei "normalen" Arduinos. Vielfach sind Lib-Anpassungen nötig, gerade was Timing (z.B. durch extra eingefügte oder angepasste delay() ) und Bus-Konfigurationen angeht (z.B. für I2C, aber auch für 1-Wire etc.).
Da hilft nur:
- entweder in nodeMCU Foren oder Repositories gezielt nach nodeMCU Treibern suchen,
oder
- riskiere es, kaufe es, und bete, dass es doch funktioniert ;)

Ceos
05.12.2017, 14:19
das display kannst du nutzen, es arbeitet mit sog. port expandern

das ist das seriell angesteuerte äquivalent zweier 8bit PORTs an einem controller, du schiebst seriell bitmuster in die "register" und die ausgänge schalten dann entsprechend um :D

insgesamt schiebst du ein 16bit wort über die serielle schnittstelle (nciht unbedingt uart), die ersten 8bit kommen über DIO in den oberen chip, welcher die segmente ansteuert und die erstlichen 8bit gehen per "daisy chain" (daisy duck, schnattert gerne) an den 2ten chip, der die digits durchsteuert

piggituX
05.12.2017, 16:45
Hi,

hier nun mal eine kleine Übung von sunfounder :) da siehst du viele Pins du benötigst, wenn du eine normale 4*7Segment nimmst. Bleibt ja dann noch das Prob mit den WLAN ?

https://www.sunfounder.com/learn/lesson-17-stopwatch-4-digit-7-segment-display-rfid-v1-0-for-arduino.html

piggituX
06.12.2017, 20:57
Hi TFlow,

einfach weil es mich persönlich interessiert hat habe ich das Sunfounder Beispiel als Grundlage genommen und nen TestAufbau für nen NodeMCU gemacht.

Damit ist der NodeMCU aber an der Grenze der zu benutzenden Pins.

http://piggitux.ignorelist.com:8085/NodeMCU_4_7Digits.mp4

Daher danke nochmal für die Fragestellung ;-) und viel Erfolg bei deinem Projekt.

TFlow
13.12.2017, 11:14
Hallo zusammen,

ich bin weiter gekommen und stehe vor dem nächsten Problem. Ich habe mir dieses Teil gekauft: https://eckstein-shop.de/8-Digit-LED-Display-Digital-Tube-Red-74HC595-for-Arduino und bekomme es auf dem Sunfounder UNO R3 zum laufen. Das Board hat leider kein WiFi. Auf dem WeMos D1 sowie dem NodeMCU (beide mit Wifi) kommt nur Kauderwelsch aufs Display. Gibt es dafür eine einfache Erklärung? Ist es evtl. einfacher mit dem UNO R3 zu arbeiten und ein externes WiFi-Modul anzuschließen?

Vielen Dank für eure Hilfe!

piggituX
13.12.2017, 12:13
Hi,

wie gesagt wenn du ein NodeMCU nimmst, benötigst du andere Libs die vom normalen Arduino sind nicht zwingend kompatibel auf nem NodeMCU. generell wäre es interessant zu wissen wie du es angeschlossen hast, und wie dein ProgramCode aussieht.
Wenn es auf dem Arduino läuft, wäere es erstmal aus meiner Sicht einfacher das Beispiel vllt auf den NodeMCU zu portieren, bevor du nun noch nen Wifi Shield kaufst.

*wave

HaWe
13.12.2017, 13:23
...bekomme es auf dem Sunfounder UNO R3 zum laufen...Auf dem WeMos D1 sowie dem NodeMCU (beide mit Wifi) kommt nur Kauderwelsch aufs Display. Gibt es dafür eine einfache Erklärung?

das ist genau das Thema, das ich mit meinem obigen Post bereits angeschnitten hatte:


bei nodeMCU kann man von vornherein NIE sicher sein, ob angeschlossene Geräte auf Anhieb funktionieren wie bei "normalen" Arduinos. Vielfach sind Lib-Anpassungen nötig, gerade was Timing (z.B. durch extra eingefügte oder angepasste delay() ) und Bus-Konfigurationen angeht (z.B. für I2C, aber auch für 1-Wire etc.).
Da hilft nur:
- entweder in nodeMCU Foren oder Repositories gezielt nach nodeMCU Treibern suchen,
oder
- riskiere es, kaufe es, und bete, dass es doch funktioniert ;)


wenn dein Display einen i2c-Chip hat, dann lass ggf mal als erstes einen i2c-Adress-Scanner damit laufen, ob es überhaupt per Wire() korrekt als Gerät mit seiner Adresse erkannt wird.

ps,
ich habe ähnliche Erfahrungen gemacht mit meinen i2c-OLED-Displays, auch da funktionierten keine normaler Arduino-Treiber (ebenso beim 1-Wire Sensor DHT22) , und es halfen erst andere Libs, die speziell angepasst waren für esp8266.
- Aber teste erst mal mit dem i2c-Scanner (falls es ein i2c Gerät ist)!

TFlow
13.12.2017, 15:22
Scanning...
No I2C devices found


Könnte es trotzdem mit der richtigen library funktionieren?

HaWe
13.12.2017, 15:33
ist denn ein i2c chip drauf?
ggf. welcher?
welche Lib verwendest du?

TFlow
13.12.2017, 15:46
Sorry, ich habe keine Ahnung von der Hardware :(

Hier mal der Code, läuft ohne library:

int rck = 5;
int sck = 6;
int dio = 7;

byte num[11]={B11000000, B11111001, B10100100, B10110000,
B10011001, B10010010, B10000010, B11111000, B10000000, B10011000, B01000000};
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.

byte pos[8]={1, 2, 4, 8, 16, 32, 64, 128};

void setup() {
pinMode(rck, OUTPUT);
pinMode(sck, OUTPUT);
pinMode(dio, OUTPUT);
}

int geo[] = {99, 99, 99, 99, 10, 1, 2, 3};
// 99 = " ";
// 10 = 0.
// Ausgabe: " 0.123"

void loop() {
for (int j = 0; j < 8; j++) {
digitalWrite(rck, LOW);
shiftOut(dio, sck, MSBFIRST, pos[j]);
shiftOut(dio, sck, MSBFIRST, num[geo[j]]);
digitalWrite(rck, HIGH);
delay(2); // This keeps the flicker above 60 Hz
}
}

HaWe
13.12.2017, 15:53
sieht nach Schieberegister aus, damit kenne ich mich aber nicht aus.
Eventuell setze mal ein delay(1) hinter jedes digitalWrite und jedes shiftOut.

Andererseits verwendest du die GPIO-Nummern, nicht die D-Nummern: bist du sicher, dass du richtig verkabelt hast?
http://www.mikrocontroller-elektronik.de/wp-content/uploads/2017/01/NodeMCU-pinbelegung.png

Hast du den richtigen Arduino-Board-Treiber installiert und ausgewählt (nodeMCU 1.0) ?

TFlow
13.12.2017, 16:07
Andererseits verwendest du die GPIO-Nummern, nicht die D-Nummern: bist du sicher, dass du richtig verkabelt hast?
http://www.mikrocontroller-elektroni...inbelegung.png

:Haue

Danke!

HaWe
13.12.2017, 16:13
haha, gern! :idea: 8) :Weihnacht

TFlow
15.12.2017, 20:12
Jetzt muss ich mich doch noch einmal melden.. :-k Ich hänge jetzt seit Stunden an dem gleichen Problem.

Alles läuft soweit wunderbar. Ich frage per GET eine Datenbank ab und gebe die Zahl auf dem Display aus. Das Problem ist, dass die Verbindung zum Server das System blockiert und das Display in der Zeit ausgesetzt ist. Es geschieht an dieser Stelle:


if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("URL_ZUR_DB");
int httpCode = http.GET();


Gibt es eine Möglichkeit, dass ich während des Verbindungsaufbaus trotzdem meinen loop() durchlaufe? Ist es z.B. möglich, die Verbindung im Hintergrund aufzubauen, sodass laufende loops() nicht betroffen sind?

Oder alternativ (wobei ich hier keine wirkliche Chance sehe): Ist es möglich, das Display zu "freezen" und einfach die letzte Zahl stehen zu lassen solange die Verbindung aufgebaut wird? Nach meinem Verständnis kann immer nur ein Segment "stehen bleiben", niemals alle 8 Segmente. Deshalb ja die Endlosschleife...

Ceos
15.12.2017, 21:44
ich kenne mich jetzt mit der HTTP library nicht genug aus, aber grundsätzlich ist paralleles arbeiten auf einem microcontroller ein riesen problem, die haben zwar interrupts die es erlauben die normale code ausführung zu unterbrechen um etwas anderes zu machen aber arduino bietet keine möglichkeit aufgaben gleichzeitig abzuarbeiten

ich hab mal spontan auf github ne lib gerfunden die das ermöglichen soll aber geteset habe ich jetzt nichts
https://github.com/ivanseidel/ArduinoThread

vielleicht kannst du damit was erreichen, ansonsten wäre der nächst beste ansatz für dich einen timer zu benutzen der immer die segmente umschaltet statt einer loop ... in der loop arbietet jetzt nurnoch die webabfrage und wann immer der timer tickt, wird der code kurz unterbrochen um die nächste ziffer umzuschalten

TFlow
15.12.2017, 22:37
Timer bzw. Ticker kannte ich noch gar nicht. Klappt jetzt, danke! \\:D/ :pray:

Ceos
16.12.2017, 11:20
ich mach sowas üblicherweise bare metal, wie sieht sowas denn in arduino aus? magst du es mal teilen? :)

HaWe
18.12.2017, 11:25
ich muss sagen , mich interessiert dein Code auch!
Ich verwende ja nun den nodeMCU samt Arduino-Libs selber, allerdings bin ich sehr an dem Datenbank-Ding interessiert:
was das für eine Datenbank ist,
was das für ein Datenbank-Server ist,
wie du die Datenbank im web hostest,
und wie du Daten dort abfragst und ggf. auch speicherst.