Hallo liebe Leute! Ich habe seit gestern mein Heimtrainer-Projekt fertig! :-) Falls ihr euch noch an meinen damaligen Thread erinnern könnt: Ich wollte damals, dass mich meine Freundin übers Internet "beobachten" kann, ob ich fleißig auf meinem Strampelgerät trainiere um abzuspecken ;-) Die Freundin gibts nun nicht mehr (lag aber nicht an dem wenigen Training), das Projekt schlummerte eine gewisse Zeit und in den letzten Tagen habe ich es gar fertig gestellt :) Kurz umrissen: Es sollte ein Webinterface sein, dass die aktuelle Drehzahl/minute grafisch darstellt, die im Moment am Heimtrainer durch Treten erzeugt wird. Diese Drehzahl wird über einen Reed-Kontakt (im Moment ist es noch ein Schalter, der die Drehzahl simuliert) an einen MIkrocontroller geschickt, der lediglich bei einem "Tastendruck" über den UART ein Zeichen an den PC schickt. Am PC habe ich ein VB-Programm programmiert, dass die Zeichen in Abhängigkeit von der Zeit zählt und daraus die Zeit ermittelt. Es gibt 9 verschiedene Drehzahlstufen. Von 20 in 20er-Schritten bis 180. Der PC schickt wiederum den jeweiligen Parameter (je nach Drehzahl am Heimtrainer) via CGI an meinen Linux-Server, auf dem ein CGI-Skript (geschrieben in C) vorliegt. Ist die URL ohne Übergabeparameter, so wird das CGI im Viewmode geöffnet und sekündlich aktualisiert. Je nach Übergabeparameter, wird dann die jeweilige Grafik (Drehzahlmesser) dargestellt. Viele werden jetzt wahrscheinlich denken, warum so umständlich, warum schließt der nich gleich das AVR-Board an den Server an. -> Damals war es noch Spruchreif, dass meine freundin das gleiche vorhat, und zwar, damit ICH SIE überwachen kann, sie aber über keinen Server verfügte. Somit kann man also von jedem PC der ans I-Net angeschlossen ist, die Parameter mit einem Heimtrainer (höhö) übergeben :) Falls Interesse am CGI-Skript oder ähnlichem besteht, bitte melden :) Ich weiß, es ist ein "unproduktives" Projekt, das wohl keiner brauchen wird. Aber ich denke, die Idee ist nicht schlecht, selbst wenns nur um eine Überwachung des Eigenheims ist. Es gibt ja auch kostengünstigen Webspace (Webserver), die CGI unterstützen. Liebe Grüße Joh!
Wieso stellst du die Files hier nicht einfach rein und die Leute schauen sich das an und entscheiden dann, ob sie es brauchen oder nicht?
Hier mal die CGI-Datei:
1 | //Features für die Zukunft: Überprüfen welcher Browser verwendet wird -> SVG-kompatibel?
|
2 | //Keine statischen Bitmaps verwenden, sondern SVGs integrieren
|
3 | |
4 | //Meta Refresh (HTML --> printf) einfügen, um die Seite im viewMode ständig zu aktualisieren
|
5 | |
6 | // weitere Vorhaben:
|
7 | |
8 | //Interaktiver Zähler für Benutzer am Browser (Rücksetz-Button für Umdrehungsanzahl -> "Tageskilometer")
|
9 | |
10 | #include <stdio.h> |
11 | #include <stdlib.h> |
12 | #include <fcntl.h> |
13 | #include <sys/types.h> |
14 | #include <sys/stat.h> |
15 | |
16 | |
17 | |
18 | void print_html_header(void) { |
19 | printf("<html><head>\n"); |
20 | printf("<title>Tachometer</title>\n"); |
21 | printf("</head><body bgcolor=#b3b3b3><pre>\n"); |
22 | }
|
23 | /* Das Ende eines HTML-Dokuments */
|
24 | void print_html_end(void) { |
25 | printf("</pre></body></html>\n"); |
26 | }
|
27 | /* Damit überhaupt ein HTML-Dokument ausgegeben wird */
|
28 | void print_header(void) { |
29 | printf("Content-Type: text/html\n\n"); |
30 | }
|
31 | |
32 | void param_pict_load(char parameter) |
33 | {
|
34 | switch(parameter) |
35 | {
|
36 | case 0: |
37 | printf ("<img src = /apache2-default/cgi-bilder/DZM_0.png>"); //ergänzen! |
38 | break; |
39 | case 1: |
40 | printf ("<img src = /apache2-default/cgi-bilder/DZM_1.png>"); //ergänzen! |
41 | break; |
42 | case 2: |
43 | printf ("<img src = /apache2-default/cgi-bilder/DZM_2.png>"); //ergänzen! |
44 | break; |
45 | case 3: |
46 | printf ("<img src = /apache2-default/cgi-bilder/DZM_3.png>"); //ergänzen! |
47 | break; |
48 | case 4: |
49 | printf ("<img src = /apache2-default/cgi-bilder/DZM_4.png>"); |
50 | break; |
51 | case 5: |
52 | printf ("<img src = /apache2-default/cgi-bilder/DZM_5.png>"); |
53 | break; |
54 | case 6: |
55 | printf ("<img src = /apache2-default/cgi-bilder/DZM_6.png>"); |
56 | break; |
57 | case 7: |
58 | printf ("<img src = /apache2-default/cgi-bilder/DZM_7.png>"); |
59 | break; |
60 | case 8: |
61 | printf ("<img src = /apache2-default/cgi-bilder/DZM_8.png>"); |
62 | break; |
63 | case 9: |
64 | printf ("<img src = /apache2-default/cgi-bilder/DZM_9.png>"); |
65 | break; |
66 | }
|
67 | }
|
68 | |
69 | |
70 | int main(void) { |
71 | char *temp; |
72 | FILE *pFile; |
73 | int *p; |
74 | int read_data = 0; |
75 | long input_value =0; |
76 | print_header(); |
77 | print_html_header(); |
78 | //p = getenv("HTTP_USER_AGENT");
|
79 | temp = getenv("QUERY_STRING"); //die Funktion getenv() liefert den Wert hinter "?" |
80 | //printf ("<tr><td>Hallo!</td></tr>");
|
81 | |
82 | if(p!=NULL) |
83 | {
|
84 | //öffnet eine Datei namens "messwerte.dat" unter usr/lib/cgi-bin/
|
85 | |
86 | if ((*temp) > 0) |
87 | {
|
88 | pFile = fopen("messwerte.dat", "w"); |
89 | printf("<tr><td>DevMode!</tr></td>"); |
90 | fwrite(temp,sizeof(temp),1,pFile); |
91 | fclose(pFile); |
92 | |
93 | }
|
94 | |
95 | else
|
96 | {
|
97 | printf ("<meta http-equiv=refresh content=1; URL=/tacho.cgi>"); //aktualisiert Browser |
98 | pFile = fopen("messwerte.dat", "r"); |
99 | fread(&read_data,sizeof(int),1,pFile); //...wird Datei ausgelesen... |
100 | fclose(pFile); |
101 | input_value = read_data-1163001904; |
102 | param_pict_load(input_value); |
103 | //...und das jeweilige Bild geladen.
|
104 | }
|
105 | fclose(pFile); |
106 | }
|
107 | print_html_end(); |
108 | |
109 | return EXIT_SUCCESS; |
110 | }
|
Schade, Schade! Du hast Dir zwar sehr viel Mühe mit Deinem Projekt gegeben. Aber leider kann niemand mit dem CGI-Script alleine was anfangen. Für eine vernünftige Projektdokumentation hätte ich noch folgendes vorgeschlagen: Schaltplan Controller board GGv. Gerber oder Brd-files Stückliste. Anschlussplan / Wiring Diagram Sourcecodes für den Controller ggv. hex-files Funktionsbeschreibung Für den PC: Sourcecodes oder VB-scripte. Funktionsbeschreibung
@ Joh!
Ich kann mich an dich erinnern, schade dass das nicht geklappt hat.
Zum Hometrainer:
- Wichtig ist dass es fair bleibt. Wenn ich die höchste Belastungsstufe
(10 bei meinem) eingestellt habe kommt man kaum vorwärts und
dementsprechend ist die Drehzahl auch sehr niedrig.
Das heißt dass der momentan eingestellte Widerstandswert mit dastehen
müsste.
Dein Script sieht gut aus, scheint das wichtigste vorhanden zu sein.
(Meiner eins kann nur PHP+HTML sonst keine Scriptsprachen ... okay noch
das nötigste für die shell)
>>> Meld dich doch mal an <<<
Ich verstehe nicht so richtig wie deine Freundin ihre Daten auf deinen
Webserver schiebt.
Aber mal ein Vorschlag:
- Dieses besagte VB-Programm läuft auf ihrem Rechner, liest die
Kontaktunterbrechungen aus und ...
schreibt besagte Daten über ein PHP-Script (mit der methode $_GET
übergeben ) in eine MySQL-Datenbank :)
Zusätzlich noch (falls der andere den PC an hat) auf den Monitor.
lg
Warum überhaupt der Atmel? Nur im eine 0 oder 1 an den PC zu bekommen, kann man auch die Signalleitungen der Seriellen Schnittstelle nutzten.
Habe ich mich auch gefragt, wofür man da den Atmega braucht. Außerdem: Wenn deine Freundin mit der einen Hand an der Pedal dreht und dabei die Internetverbindung trennt, so wird der letzte Wert doch dauerhaft gespeichert und es sieht so aus, als würde sie die ganze Zeit weiterstrampeln. Ein Timestamp der letzten Aufzeichnung wäre noch nötig...
Hallo leute! Sorry, dass ich erst jetzt schreibe, war mit der Firma mal wieder für ein paar Tage auf Reise... der Atmel deswegen, weil diese "Bremse" am Heimtrainer elektronisch funktioniert. Will dann im nächsten Schritt diesen Wert per ADC (und DAFÜR der Atmel) auswerten und nicht nur 1en über den UART an den PC schicken. Außerdem finde ich es nicht besonders elegant, wenn man direkt die serielle Schnittstelle vom PC hernimmt um irgendwelche Signale an den PC zu schicken. Habe Angst, dabei was abzuschießen, drum ist es mir wichtig, auch einen Controller zu verwenden, wenn er noch so simple Tätigkeiten macht, wie in meinem bisherigen Fall :) Aber natürlich hast du Recht, ich hätte es einfacher auch OHNE Controller lösen können. Du hast natürlich Recht, im moment bleibt noch der letzte Wert stehen, dafür sorgt aber das VB-Programm am PC, sobald keine 1en mehr kommen (für länger als 5 sec), dann übergibt es den Parameter "0" an den Server und setzt somit den "Drehzahlmesser" auf null. Das mit der SQL-Datenbank klingt auch nicht schlecht. Aber welchen Vorteil bietet mir denn eine Datenbank im Bezug auf ein *.dat-file? Ich habe ja nicht vor, die Daten längerfristig zu speichern. Gruß
@ ATmega8 ATmega8: Das ist ja genau der Witz von CGI, dass man als Client Parameter an den Server übergeben kann :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.