Forum: Projekte & Code Heimtrainer-Projekt fertig!


von Joh! (Gast)


Lesenswert?

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!

von Gast (Gast)


Lesenswert?

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?

von Joh! (Gast)


Lesenswert?

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
}

von Frank B. (frankman)


Lesenswert?

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

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

@ 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

von auto_index (Gast)


Lesenswert?


von Peter (Gast)


Lesenswert?

Warum überhaupt der Atmel? Nur im eine 0 oder 1 an den PC zu bekommen, 
kann man auch die Signalleitungen der Seriellen Schnittstelle nutzten.

von Moi (Gast)


Lesenswert?

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...

von joh! (Gast)


Lesenswert?

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ß

von joh! (Gast)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.