arduinoでのWeb温度計を作ろうかなの話 -普通のWebページまで-

前回、温湿計を使ったローカルの端末を作りました。
arduinoでのWeb温度計を作ろうかなの話 -普通の温度計まで-

今回はWebアクセスすると現在コンソールに直接出力している温度、湿度を表示するページを表示しますって感じですね。

始めに、ハード系です。
前回紹介しました。ENC26J60を接続してやります。

と言っても、シンプルに接続!

ENC28J60ArduinoCable Color

1 VCC VCC +5V RED
2 CS D10 Orange
3 SI D11 Green
7 SO D12 Blue
8 SCK D13 Yellow
10 GND GND Black

ちょっとだけシルク印刷のピン名が分かりづらかったですが、配線します!

MISOとかのピンが印刷にないのでちょっと困りましたが、ググれば出るでしょう!

次にプログラムですが….

#include 
#include 

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192, 168, 1, 177 };
byte Ethernet::buffer[700];
float humidity = 0.00;
float temperature = 0.00;

void setup() {
  // put your setup code here, to run once:
  Wire.begin();       
  Serial.begin(115200);

  if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println("No se ha podido acceder a la controlador Ethernet");
  else
    Serial.println("Controlador Ethernet inicializado");

  if (!ether.staticSetup(myip))
    Serial.println("No se pudo establecer la dirección IP");
  Serial.println();

//  Serial.println("Setting up DHCP");
//  if (!ether.dhcpSetup()){
//    Serial.println( "DHCP failed");
//  }

  delay(100); 

  Serial.println("done");
  
  ether.printIp("My IP: ", ether.myip);

}
void loop() {
  
    readSensor();

    if (ether.packetLoop(ether.packetReceive())){
      printPage(humidity,temperature);
    }
}
void readSensor(){
  readAM2320();
}
void readAM2320(){
  // AM2320
    int ans = Wire.requestFrom(0x5c,6);// request 6 bytes

    Wire.beginTransmission(0x5c);     // address(0x5c)
    Wire.write(0x03); //Arduino read senser
    Wire.write(0x00); //address of Humidity
    Wire.write(0x04); //The number of address
                      //(Humidity1,Humidity2,Temperature1,Temperature2)
    Wire.endTransmission();// 
    delay(100);

    int H1,H2,T1,T2 = 0;
    while(Wire.available() !=0){   
      for(int i = 1; i <  ans+1; i++){     
          int code = Wire.read();        
          switch (i){    
              case 5:
              T1 = code;
              break;
              case 6:
              T2 = code; 
              break;
              case 3:
              H1 = code; 
              break;
              case 4: 
              H2 = code;  
              break;
              default:
              break;
        }       
      }
    }
    humidity = (H1*256 + H2)/10.0; 
    temperature = (T1*256 + T2)/10.0; 

    if(humidity == 0)readAM2320();
}
void printPage(float humidity,float temperature){
    char strTemp[6];
    char strHum[6];

    Serial.print(" response Temp : ");
 
    dtostrf(temperature,3,2,strTemp);
    dtostrf(humidity,3,2,strHum);
    
    Serial.print("temperature : ");
    Serial.print(strTemp);
    Serial.print("'C  humidity : ");    
    Serial.print(strHum);
    Serial.println("% ");    

     BufferFiller bfill = ether.tcpOffset();
     bfill.emit_p(PSTR(
      "HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\n"
      "Pragma: no-cache\r\n\r\n"
      ));

     bfill.emit_p(PSTR(
      "<html><head><title>Web Control</title></head><body>"
      "<body bgcolor=""#ccccff"">"
      "<font size=""6"">"
      "<center>"
      "Temperature... : "
      "<b> $S &deg;C </b>"
      "Humidity... : "
      "<b> $S %</b>"
      "</body></html>"
      ),
      strTemp,strHum);
    ether.httpServerReply(bfill.position());
    delay(100);

}

こいつもシンプルにしていますが、ポイントは、readAM2320()です。
リクエスト時にsensorを読み取らせると、0℃ / 0% ってのが出る問題が出ます。

readAM2320()って部分も、0%が出るので、再読み取りさせてます。
84行くらい。

 
   if(humidity == 0)readAM2320();

その他は...
シンプルですな。

void loop() {
  
    readSensor();

    if (ether.packetLoop(ether.packetReceive())){
      printPage(humidity,temperature);
    }

だけー
読み取って、アクセスをチェックして、あれば、ページを返却する。
って感じです。

http://192.168.1.177
にアクセス!

激烈のシンプルページに表示が出ます!

さて、次はどうしようかなぁ〜

次は、サーバに情報を送るかな。

グラフを表示するのが面白いかなぁ〜
その前にDB格納してテーブル表示しよう。次のフェーズにグラフかな。

では!次回を!