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 °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格納してテーブル表示しよう。次のフェーズにグラフかな。
では!次回を!