www.mikrocontroller.net

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


Autor: Florian Wefel (metaln00b)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Wefel (metaln00b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>bin neu hier.

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

Autor: Florian Wefel (metaln00b)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian Wefel (metaln00b)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt gehts. peinlich

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein paar Anmerkungen zum Code

1. nachdem es C Code ist kann man den hier sehr gut darstellen lassen
#include <SPI.h>
#include <Ethernet.h>

int inPin = 3;      // input pin 1
int inPin2 = 4;     // input pin 2
int inPin3 = 5;     // input pin 3
float inValTotal;
int i;
int runs = 5;      // Anzahl der Durchläufe
int waittime = 20;  // ms zwischen Durchläufen

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 12 };

Server server(80);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  Client client = server.available();
  if (client) {
server.println("HTTP/1.1 200 OK");
server.println("Content-Type: text/html");
server.println();
server.print("<html><head>");
server.print("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
server.print("<title>Sensorenüberwachung</title>");
server.print("</head>");
server.print("<body bgcolor='blue'>");
server.print("<p>&nbsp;</p>");
server.print("<table width='900' height='522' border='1' align='center'>");
server.print("<tr>");
server.print("<td width='192' height='289' scope='col' bgcolor='yellow'><p align='left'><u><strong>Temperaturen:</strong></u></p>");
server.print("<align='left'>Gehäuse     = ");
server.print(getTemperatur());
server.print("&deg;C");
server.print("<p />");
server.print("<align='left'>Festplatte  = ");
server.print(getTemperatur2());
server.print("&deg;C");
server.print("<p />");
server.print("<align='left'>Grafikkarte = ");
server.print(getTemperatur3());
server.print("&deg;C");
server.print("<p />");
server.print("<p align='left'><strong><u>Geschwindigkeiten:</u></strong></p>");
server.print("<p align='left'>Lüfter &quot;1&quot; = xxx %</p>");
server.print("<p align='left'>Lüfter &quot;2&quot; = xxx %</p>");
server.print("<p align='left'>Lüfter &quot;3&quot; = xxx %</p></td>");
server.print("<td width='692' scope='col' bgcolor='lightgreen'><h1 align='center'><strong>Sensorenüberwachung via Arduino©</strong></h1>");
server.print("<hr /></td></tr><tr>");
server.print("<th scope='row' bgcolor='red'><p align='center'>ROT    = Temperatur zu hoch</p>");
server.print("<p align='center'>GELB  = Normal (beanspruchende Anwendung)</p>");
server.print("<p align='center'>GRÃœN  = Optimal (Standbybetrieb)</p></th>");
server.print("<td bgcolor='lightblue'><p><strong><u>INFO:</u></strong></p>");
server.print("<p>Bei Rot: Überprüfen Sie die Lüfter ob sie verstaubt sind oder ggf. funktionieren</p>");
server.print("<p>Bei Gelb: Normal soweit eine auslastende Anwendung gestartet ist.<br />");
server.print("Sollte keine beanspruchende Anwendung gestartet sein,<br />");
server.print("verringern Sie ggf. die Raumtemperatur oder beenden ggf. auslastende Anwendungen</p>");
server.print("<p>Bei Grün: Alles Optimal gekühlt / keine Fehler</p></td>");
server.print("</tr></table>");
server.print("<p align='center'><em>by Sven Kern und Florian Wefel</em></p>");
server.print("<meta http-equiv='refresh' content='5'>");
server.print("</body></html>");
 delay(10);
    client.stop();
  }
}
float getTemperatur() {
 
  inValTotal = 0;
  for(i = 0;i<runs;i++){
    inValTotal = inValTotal + analogRead(inPin);
    delay(waittime);
  }
 
  inValTotal = inValTotal / runs / 2;
  return(inValTotal);
}
float getTemperatur2() {
 
  inValTotal = 0;
  for(i = 0;i<runs;i++){
    inValTotal = inValTotal + analogRead(inPin2);
    delay(waittime);
  }
 
  inValTotal = inValTotal / runs / 2;
  return(inValTotal);
}
float getTemperatur3() {
 
  inValTotal = 0;
  for(i = 0;i<runs;i++){
    inValTotal = inValTotal + analogRead(inPin3);
    delay(waittime);
  }
 
  inValTotal = inValTotal / runs / 2;
  return(inValTotal);
}

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) ?

Autor: Florian Wefel (metaln00b)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arduino ist cool!

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

Mit freundlichen Grüßen,
Valentin Buck

Autor: Florian Wefel (metaln00b)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Wefel (metaln00b)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push

Autor: Florian Wefel (metaln00b)
Datum:

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

LG Flo

Autor: Tüll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist sehr kompliziert? Hast du Probleme beim Prozentrechnen?

Du stellst einfach keine vernünftigen Fragen.

Autor: Florian Wefel (metaln00b)
Datum:

Bewertung
0 lesenswert
nicht 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?
  { 
    if (average <= 40)
  analogWrite(9, Pulse = 200);
server.print("75%");
  }     
  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

Autor: Tüll (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tüll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns unbedingt 25, 50 etc. sein muss:

[auf]runden(Prozentwert / 25) * 25

Autor: Florian Wefel (metaln00b)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.