Überwachung der Temperatur im Serverraum mit Arduino

Das Wochenende Ende Mai in Jekaterinburg war der Beginn des Sommers, und am Montag wurden wir in einem kleinen Raum mit zwei Server-Racks mit einer Hitze von 39 Grad begrüßt. Der Grund ist alltäglich - eine der Klimaanlagen verweigerte das Alter. Es kostete wenig Blut und fast keiner der 250 Mitarbeiter hatte Probleme.
Ich wollte irgendwie, wenn ich die Situation nicht bewältigen wollte, sie zumindest überwachen. Die Option zum Kauf eines fertigen Geräts verlangsamte sich und stornierte dann den Preis. Aber ich erinnerte mich an das Zauberwort Arduino. Wenn ich mich frage, was passiert ist, frage ich nach einer Katze.

Arduino uno und zwei Schilde (Ethernet und Tastatur) versammelten sich zu einem dreischichtigen Kuchen:
Bild

Der Temperatursensor ds18b20 wurde von oben rechts mit dem Schild der Tastatur verlötet. Um den oberen Schild zu platzieren, musste er seine Beine leicht vergrößern und den Kammverbinder verlöten, der zum Arduino gehörte.
Bild

Und sehr erfolgreich passte dieses Geschäft in eine Schaltbox eines Baumarkts.
Bild

In PHP wurde ein Skript geschrieben, um GET-Anforderungen zu akzeptieren und Daten in SQL zu schreiben.

Sobald eine Minute eine Anfrage an den Server sendet, sieht dies folgendermaßen aus:


Wie Feldversuche gezeigt haben, muss der Sensor aus dem Gehäuse genommen werden, sonst steigt die Temperatur um ca. 5 Grad, der Fehler kann jedoch programmgesteuert berücksichtigt werden.

Skizze anzeigen
#include <SPI.h>
#include <Ethernet.h>
#include "LiquidCrystal_1602_RUS.h"
#include <EEPROM.h>
#include <avr/interrupt.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <avr/wdt.h>

LiquidCrystal_1602_RUS lcd(8, 9, 4, 5, 6, 7 );//For LCD Keypad Shield
OneWire ds(15); DallasTemperature sensors(&ds); float temp; 
String readString = String(300); 
String message;

int opros=0; int sends=0; int sendperiod=0; int dog=0;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "test.domain.ru";    
IPAddress ip(10, 0, 0, 177);
EthernetClient client;

void setup() 
{
  lcd.begin(16, 2);

//    Timer2 
  TCCR2A = 0; 
  TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20; 
  TIMSK2 = 1<<TOIE2; 
  sei();
  wdt_enable(WDTO_8S);  
}

ISR(TIMER2_OVF_vect) 
{
   opros++;

//          
    if(opros==7500) 
    {
      sensors.requestTemperatures();
      temp = sensors.getTempCByIndex(0);
       lcd.setCursor(0,0); lcd.print(message); 
       lcd.setCursor(0,1); if(60-sendperiod<10){lcd.print(0);} lcd.print(60-sendperiod);
       lcd.setCursor(9,1); lcd.print(temp);  lcd.print(L"°C");
      opros=0;

//       10             
     if(sends!=0){dog++;} else {dog=0;}
      if(dog<600){wdt_reset();}  
     
//       
      if (sends==0 && sendperiod==0){sends=1;}  
      sendperiod++; if(sendperiod==60){ sendperiod=0;}  
          
    }
   
}

void loop() 
{

//     
if (sends==1) 
{
  message="Connect         ";
  lcd.setCursor(0,0); lcd.print(L"Connect         ");
  sends=2; 
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) 
  {
    ; // wait for serial port to connect. Needed for native USB port only
  }  
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) 
    {
    Serial.println("connected");
    // Make a HTTP request:
    
    client.print("GET /info/temp.php?t=");
    client.print(temp);
    client.println(" HTTP/1.1");
    client.println("Host: test.domain.ru");
    client.println("Connection: close");
    client.println();
    } 
  else 
    {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
    }
  sends=3;
}  
  
//    
if(sends==3)
 { 
  if (client.available()) 
  {
    
    char c = client.read();
    Serial.print(c);
      if (c != '\n'){readString+= c;}
 }

//    
  if (!client.connected()) 
  {
    Serial.println();
    Serial.println("disconnecting.");
    if(readString.indexOf("z666")>0)
     {message="OK ";message+= readString.substring(readString.indexOf("z666")+5,readString.indexOf("z666")+19);}
     else {message="Send error";}
    readString="";
    client.stop();
    sends=0;
  } 
 }
}

Source: https://habr.com/ru/post/de394909/


All Articles