Pemantauan suhu di ruang server menggunakan Arduino

Akhir pekan di akhir Mei di Yekaterinburg menandai awal musim panas, dan Senin kami disambut dengan panas 39 derajat di sebuah ruangan kecil dengan dua rak server. Alasannya biasa - salah satu AC menolak usia tua. Harganya sedikit darah dan hampir tidak ada dari 250 karyawan yang merasakan masalah.
Saya ingin entah bagaimana, jika bukan untuk mengelola situasi, maka setidaknya untuk memantaunya. Pilihan untuk membeli perangkat jadi melambat, dan kemudian membatalkan harganya. Tapi aku ingat kata ajaib Arduino, jika aku penasaran apa yang terjadi, aku minta kucing.

Arduino uno, dan dua perisai (ethernet dan keypad) berkumpul dalam pie tiga lapis:
gambar

sensor suhu ds18b20 disolder dari kanan atas ke perisai keypad, untuk menempatkan perisai atas, ia harus sedikit meningkatkan kakinya, menyolder konektor sisir yang menyertai arduino.
gambar

Dan sangat sukses bisnis ini masuk ke dalam kotak kabel dari toko perangkat keras.
gambar

Sebuah skrip ditulis dalam PHP untuk menerima permintaan GET dan menulis data ke SQL.

Setelah satu menit mengirimkan permintaan ke server, sepertinya ini:


Seperti yang ditunjukkan oleh tes lapangan, sensor harus dikeluarkan dari kasing, jika tidak suhu naik sekitar 5 derajat, tetapi dimungkinkan untuk memperhitungkan kesalahan secara terprogram.

Lihat Sketsa
#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/id394909/


All Articles