Forum: Mikrocontroller und Digitale Elektronik Sensorenüberwachung/Website via Arduino


von Florian W. (metaln00b)


Lesenswert?

Hallo Allerseits,

bin neu hier. Ich hab mir mal den ATmega328 zugelegt mit EthernetShield 
SD.

Ich hatte vor mit drei LM35 CZ die Temperaturen auf einer Website 
anzuzeigen. Dies habe ich auch geschafft. Dazu sollte der Durchschnitt 
von den 3 Temperaturen ausgerechnet werden (eig. ganz easy). Dieser 
Durchschnitt soll die Farbe in einer Spalte farblich anzeigen. Das heißt 
wenn z.B die Durchschnitsstemperatur zu hoch ist soll die Spalte Rot 
sein und einen gewissen Text anzeigen. Da gehts auch schon los, ich habe 
es nicht auf die Reihe bekommen. In der Spalte wo die Temperaturen und 
die Auslastung der Lüfter in % angezeigt werden, soll später noch die 
Lüfterauslastung angezeigt werden. Das mach ich mit Hilfe des PWM Wertes 
und der PWM soll dann die drei MOSFET's IRLZ34N modulieren. Dann soll 
damit je Mosfet ein 12V Gehäuselüfter gesteuert werden. An diese 
?Rücklaufdiode? habe ich auch gedacht. Wenn der Temperaturdurchschnitt 
"ROT" ist, sollen alle Lüfter 100% Leistung geben. Wenn "Gelb" dann 
sollen sie nur ca. 50% Leistung bekommen. Bei Grün nur 25%. das 
eigentliche Problem was ich jetzt habe ist halt diese Ampel unten links. 
Könnt ihr mir vielleicht dabei helfen??? Wäre echt nett.

Ich hab hier mal den Quellcode von dem was ich bis jetzt geschafft habe. 
Sry, aber die Datei bekomm ich nicht angehangen ist txt und passieren 
tut nix. Habs jetzt bei Rapidshare hochgeladen. :D

http://rapidshare.com/files/446801462/Neues_Textdokument.txt

von Florian W. (metaln00b)


Lesenswert?

push

von Mike (Gast)


Lesenswert?

>bin neu hier.

Jo, merkt man.
Warum musst Du 3kB Source bei Rapidshare hosten?
Das geht auch hier, als Anhang.

von Florian W. (metaln00b)


Lesenswert?

Mike schrieb:
>>bin neu hier.
>
> Jo, merkt man.
> Warum musst Du 3kB Source bei Rapidshare hosten?
> Das geht auch hier, als Anhang.

Nein geht es leider nicht, ich weiß auch net :D

von Simon K. (simon) Benutzerseite


Lesenswert?

Florian Wefel schrieb:
> Mike schrieb:
>>>bin neu hier.
>>
>> Jo, merkt man.
>> Warum musst Du 3kB Source bei Rapidshare hosten?
>> Das geht auch hier, als Anhang.
>
> Nein geht es leider nicht, ich weiß auch net :D

Doch geht.

von Florian W. (metaln00b)


Angehängte Dateien:

Lesenswert?

Jetzt gehts. peinlich

von Lehrmann M. (ubimbo)


Lesenswert?

Ein paar Anmerkungen zum Code

1. nachdem es C Code ist kann man den hier sehr gut darstellen lassen
1
#include <SPI.h>
2
#include <Ethernet.h>
3
4
int inPin = 3;      // input pin 1
5
int inPin2 = 4;     // input pin 2
6
int inPin3 = 5;     // input pin 3
7
float inValTotal;
8
int i;
9
int runs = 5;      // Anzahl der Durchläufe
10
int waittime = 20;  // ms zwischen Durchläufen
11
12
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
13
byte ip[] = { 192, 168, 0, 12 };
14
15
Server server(80);
16
17
void setup()
18
{
19
  Ethernet.begin(mac, ip);
20
  server.begin();
21
}
22
23
void loop()
24
{
25
  Client client = server.available();
26
  if (client) {
27
server.println("HTTP/1.1 200 OK");
28
server.println("Content-Type: text/html");
29
server.println();
30
server.print("<html><head>");
31
server.print("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
32
server.print("<title>Sensorenüberwachung</title>");
33
server.print("</head>");
34
server.print("<body bgcolor='blue'>");
35
server.print("<p>&nbsp;</p>");
36
server.print("<table width='900' height='522' border='1' align='center'>");
37
server.print("<tr>");
38
server.print("<td width='192' height='289' scope='col' bgcolor='yellow'><p align='left'><u><strong>Temperaturen:</strong></u></p>");
39
server.print("<align='left'>Gehäuse     = ");
40
server.print(getTemperatur());
41
server.print("&deg;C");
42
server.print("<p />");
43
server.print("<align='left'>Festplatte  = ");
44
server.print(getTemperatur2());
45
server.print("&deg;C");
46
server.print("<p />");
47
server.print("<align='left'>Grafikkarte = ");
48
server.print(getTemperatur3());
49
server.print("&deg;C");
50
server.print("<p />");
51
server.print("<p align='left'><strong><u>Geschwindigkeiten:</u></strong></p>");
52
server.print("<p align='left'>Lüfter &quot;1&quot; = xxx %</p>");
53
server.print("<p align='left'>Lüfter &quot;2&quot; = xxx %</p>");
54
server.print("<p align='left'>Lüfter &quot;3&quot; = xxx %</p></td>");
55
server.print("<td width='692' scope='col' bgcolor='lightgreen'><h1 align='center'><strong>Sensorenüberwachung via Arduino©</strong></h1>");
56
server.print("<hr /></td></tr><tr>");
57
server.print("<th scope='row' bgcolor='red'><p align='center'>ROT    = Temperatur zu hoch</p>");
58
server.print("<p align='center'>GELB  = Normal (beanspruchende Anwendung)</p>");
59
server.print("<p align='center'>GRÃœN  = Optimal (Standbybetrieb)</p></th>");
60
server.print("<td bgcolor='lightblue'><p><strong><u>INFO:</u></strong></p>");
61
server.print("<p>Bei Rot: Überprüfen Sie die Lüfter ob sie verstaubt sind oder ggf. funktionieren</p>");
62
server.print("<p>Bei Gelb: Normal soweit eine auslastende Anwendung gestartet ist.<br />");
63
server.print("Sollte keine beanspruchende Anwendung gestartet sein,<br />");
64
server.print("verringern Sie ggf. die Raumtemperatur oder beenden ggf. auslastende Anwendungen</p>");
65
server.print("<p>Bei Grün: Alles Optimal gekühlt / keine Fehler</p></td>");
66
server.print("</tr></table>");
67
server.print("<p align='center'><em>by Sven Kern und Florian Wefel</em></p>");
68
server.print("<meta http-equiv='refresh' content='5'>");
69
server.print("</body></html>");
70
 delay(10);
71
    client.stop();
72
  }
73
}
74
float getTemperatur() {
75
 
76
  inValTotal = 0;
77
  for(i = 0;i<runs;i++){
78
    inValTotal = inValTotal + analogRead(inPin);
79
    delay(waittime);
80
  }
81
 
82
  inValTotal = inValTotal / runs / 2;
83
  return(inValTotal);
84
}
85
float getTemperatur2() {
86
 
87
  inValTotal = 0;
88
  for(i = 0;i<runs;i++){
89
    inValTotal = inValTotal + analogRead(inPin2);
90
    delay(waittime);
91
  }
92
 
93
  inValTotal = inValTotal / runs / 2;
94
  return(inValTotal);
95
}
96
float getTemperatur3() {
97
 
98
  inValTotal = 0;
99
  for(i = 0;i<runs;i++){
100
    inValTotal = inValTotal + analogRead(inPin3);
101
    delay(waittime);
102
  }
103
 
104
  inValTotal = inValTotal / runs / 2;
105
  return(inValTotal);
106
}

2. Wo genau ist deine void main() ?
3. Wo genau ist deine Endlossschleife ?
4. Funktioniert der MEGA überhaupts ? (lass mal ne LED blinken, etc), 
stimmmen die Taktquelleneinstellungen, Fuses
5. Wie sieht es mit der Hardware aus ? Da alles richtig ? Schaltplan 
posten
6. Was für eine Umgebung ist das ? AVR-GCC, MicroC ? Zum Programmieren 
ungeeignete Späße (Arduino und schlimmere) ?

von Florian W. (metaln00b)


Lesenswert?

1. Wusste ich war nur meiner Meinung nach zu lang (Forenregeln) :D

2. Keine Ahnung wozu ich die brauch.

3. Die Seite aktuallisiert sich jede 5 Sekunden
server.print("<meta http-equiv='refresh' content='5'>");

4. OKAY???!!!

5. Ich kanns grad erklären, wenn es das ist was du wissen willst, weil 
ich find mein S-Plan nicht mehr.

Der LM35 CZ bzw. die drei hab ich an Pin 3,4 und 5 (Analog 
Input)angeschlossen.
Und die drei_ Mosfets sollen über _ein PWM-Pin gesteuert werden und 
über eine externe Stromversorgung, sollen die drei Lüfter versorgt 
werden.

6. Es ist ein Arduino Duemilanove (2009), sorry das ich das nicht gleich 
gesagt habe.

Danke für die schnellen Antworten.
Und Danke im Vorraus für alle weiteren. :D

von Verwirrter Anfänger (Gast)


Lesenswert?

Naja, dass es ein Arduino ist steht ja schon im Titel. Und lass dir 
jetzt bloß nicht einreden, dass der nur Schrott ist, zum Einstieg finde 
ich den sehr gut.

Ich bin mir nur gerade nicht sicher, was dein genaues Problem ist.
Ist es die Farbe auszurechnen, die Steuerung der Lüfter oder der 
Durchschnittswert?

Grundsätzlich würde ich deinen Code umgestalten:
- Speicher die Werte der Temperatursensoren in globalen Variablen
- Lager die Ausgabe der Webseite in eine eigene Funktion aus, die diese 
Variablen nutzt
- Schreib dir eine Funktion die anhand der Variablen die Lüfter steuert.

In deiner loop() wird dann nur noch
- Die Temperaturwerte aktualisiert
- Die Webseitenfunktion aufgerufen
- Die Lüfterfunktion aufgerufen

Dazu solltest du vielleicht noch eine Art "Tragheit" simulieren, damit 
sich die Lüftergeschwindigkeit nicht zu häufig wechselt

(z.B.
20% Grün,
20% - 30% bleibt bei grün oder gelb,
30%-60% gelb,
60% - 70% gelb oder rot, was immer es davor war
70% Rot)

Ciao,
Philip

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Arduino ist cool!

@umimbo:
Die void loop ist beim Arduino die Mainloop!

Mit freundlichen Grüßen,
Valentin Buck

von Florian W. (metaln00b)


Lesenswert?

Danke "verwirrter Anfänger", für die schnelle Antwort :D

Zu dem Titel :...Ja ich weiß schon nicht mehr was ich geschrieben habe. 
:D

"Ja er soll den Durchschnitt von den Temperaturen berechnen und von 
diesem Durchschnitt die Farbe "wählen", auch der PWM- Wert, soll sich 
dem Durchschnitt anpassen." Insgesamt ist das mein problem :D

Ich hoff du weißt was ich meine :D


Kannst du mir bitte ein Bespiel geben, wie ich am einfachsten die 
Variablen mit den Temp.-Werten stopfe? Ich habs leider net so gut drauf 
mit C.

Bei dieser Funktion, weiß ich z.B. nicht was dieses inValTotal ist. :D
Meine Stärke ist da eher HTML, Javascript und ein bissl Java.

Danke nochmals im Vorraus

LG FLo

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Ein bisschen Java ist doch gut.
Geht schon mal in die richtige Richtung.

Mal als Ansatz:
1. Du musst die Temperaturen alle speichern, um einen Mittelwert bilden 
zu können.

2. Wie man einen arithmetischen Mittelwert bildet, weißt du?

3. Die Auswahl löst du durch eine switch-case-Anweisung oder falls du es 
mit einfacheren Sachen machen willst durch verschachtelte 
if-Anweisungen.

4. Du brauchst eine Variable, in der dein aktueller Stand gespeichert 
wird.

5. Dann musst du nur noch diese Variable einlesen und regelmäßig mit den 
Punkten davor erneuern.

Mit freundlichen Grüßen,
Valentin Buck

von Florian W. (metaln00b)


Angehängte Dateien:

Lesenswert?

Danke, danke, danke ich hab die "Ampel" hinbekommen. JUHUU

Jetzt häng ich am PWM.
Das PWM soll sich jetzt dem Durchschnitt anpassen, er soll aber auch in 
Prozent anzeigen, ob das PWM schnell oder langsam ist. Das ist sehr 
kompliziert.

Ich hab gedacht das geht ungefähr so wie beim "Fade". Was sagt ihr?

Hab nochmal das Update von der Überwachung angehangen und ein Screenshot 
von dem ganzen gemacht.

Da wo die Makierung ist soll die Stärke des PWM-Signals angezeigt werden 
(25%, 50%, 75% und 100%) Bei 100% ist ja klar das der PWM-Variablenwert 
255 betragen muss/sollte. Die Lüfter sollen alle gleich schnell 
laufen!!! :D

Danke im Vorraus für weitere Antworten

LG FLo

von Ich (Gast)


Lesenswert?

push

von Florian W. (metaln00b)


Lesenswert?

Kann mir den keiner helfen??? Ich weiß nicht weiter :-(

LG Flo

von Tüll (Gast)


Lesenswert?

Was ist sehr kompliziert? Hast du Probleme beim Prozentrechnen?

Du stellst einfach keine vernünftigen Fragen.

von Florian W. (metaln00b)


Lesenswert?

Sorry, :D

Also,

aus dem Durchschnitt soll das PWM Signal gesteuert werden.

Das heißt z.b bei 60°C, 255 (PWM wert) sollen 100% angezeigt werden.

und bei z.b 30°C, 120 (PWM wert) sollen 50% angezeigt werden usw.

Wie bekom ich das hin? Ich komm mit C nicht so klar.
Etwa so?
1
  { 
2
    if (average <= 40)
3
  analogWrite(9, Pulse = 200);
4
server.print("75%");
5
  }     
6
  delay(30);

Alle Lüfter sollen mit einem PWM-Signal gesteuert werden über Mosfet's.
Dabei sollen aber alle gelich schnell laufen, das heißt bei 30°C sollen 
alle 50% laufen.

Die einzigsten werte die angezeigt werden sollen sind, 25%, 50%, 75% und 
100%


Danke im Vorraus

LG FLo

von Tüll (Gast)


Lesenswert?

Hmm also das hat ja nicht direkt mit uC zu tun, sondern ist eher Mathe 
Basics...

Also wenn 60° und heisser 100% Lüfterdrehzal (255 PWM) entspricht:

x / 0.6 = Lüfterdrehzal

(z.B. 50° / 0.6 = 83.333%) -> kannst du ja auch so auf Website tun



x * 255 / 60 = PWM Wert

(z.B. 50° * 255 / 60 = 212.5) -> musst halt runden


vorher if (x > 60) x = 60
wäre sinnvoll.

So wäre der Lüfter erst bei 0° aus, ob das sinnvoll ist weiss ich nicht. 
Aber wenn er eh immer lüften muss gehts wohl.

Viel Glück

von Tüll (Gast)


Lesenswert?

Wenns unbedingt 25, 50 etc. sein muss:

[auf]runden(Prozentwert / 25) * 25

von Florian W. (metaln00b)


Angehängte Dateien:

Lesenswert?

Ich hab es so gemacht. LÄUFT :D


Danke nochmal für eure Hilfe :D

Ich wünsch euch noch viel Spaß.

Ich hoffe ich helfe auch anderen mit dem Sourcecode :D

LG FLo

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Kleiner Tipp:
Wenn du die Datei als *.c-Datei anhängst, kann man hier im Forum auch 
Quellcodeeinfärbung haben!

Freut mich, dass du es geschafft hast!

Mit freundlichen Grüßen,
Valentin Buck

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.