2016年10月08日

Web Server

Arduino の 本家、元祖 争いは和解したようです。
http://www.itmedia.co.jp/news/articles/1610/03/news055.html

 Ethernet に接続します。以前、UDP 接続しましたが、今回は TCP で行います。Arduino にEthernet シールドを追加し、ウエブサーバーとします。
 ウエブサーバと言っても Apache や nginx のようなものではありません。Perl や Ruby は間違っても動きません。C 言語で作ります。
 まずはArduino に温湿度センサーを付け、それをネットに公開します。定期的に温湿度センサーよりデータを取得して呼び出されたブラウザに結果を送ります。温湿度センサーはAM2321を使用しますが、多分、これが最後です。(ディスコンのため)
ウエブサーバーもサンプルスケッチがありそれを元に機能を追加します。

WebSrever.jpg


サンプルにAM2321よりデータを読み込むルーチンを追加して定期的に温度、湿度を送信します。表示は HTML に準拠して文字列を作りそれを TCP で送信します。サーバーはMACアドレスとIPアドレスをセットし、Web で使用するポート(80)を指定して

server.begin();

とすれば稼働を開始します。日本語表示は Web Browser 側でエンコードを UTF-8 に設定してください。
Temp&Humi.jpg
Uno_Ether_AM2321_01.jpg
Ether_AM2321_3.jpg

01: /*
02: Web Server
03:
04: A simple web server that shows the value of the analog input pins.
05: using an Arduino Wiznet Ethernet shield.
06:
07: Circuit:
08: * Ethernet shield attached to pins 10, 11, 12, 13
09: * Analog inputs attached to pins A0 through A5 (optional)
10:
11: created 18 Dec 2009
12: by David A. Mellis
13: modified 9 Apr 2012
14: by Tom Igoe
15: modified 02 Sept 2015
16: by Arturo Guadalupi
17:
18: */
19:
20: #include <SPI.h>
21: #include <Ethernet.h>
22: #include <string.h> // for strcmp
23: #include <Wire.h>
24:
25: typedef struct {
26: int HumidityH ; // 湿度 整数
27: int HumidityL; // 湿度 小数点以下
28: int TemperatureH; // 温度 整数
29: int TemperatureL; // 温度 小数点以下
30: } HumidityTemperature_t ;
31:
32: byte I2C_AM2321 = 0x5c ; // AM2321 I2C Slave address
33: byte I2C_data[8]; // AM2321 受信データエリア
34:
35: // Enter a MAC address and IP address for your controller below.
36: // The IP address will be dependent on your local network:
37: byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0xEB }; // 1.MAC Address
38: IPAddress ip(192, 168, 100, 77); // 2.IP Address
39:
40: // Initialize the Ethernet server library
41: // with the IP address and port you want to use
42: // (port 80 is default for HTTP):
43: EthernetServer server(80); // 3.Port 指定
44:
45: void GetTempHumidi(HumidityTemperature_t* ht) ;
46:
47: void setup() {
48: // Open serial communications and wait for port to open:
49: Serial.begin(9600);
50: while (!Serial) {
51: ; // wait for serial port to connect. Needed for native USB port only
52: }
53: Wire.begin(); // I2C 準備
54:
55: // start the Ethernet connection and the server:
56: Ethernet.begin(mac, ip); // 4.Ethernet 開始
57: server.begin(); // 5.サーバー開始
58: Serial.print("server is at ");
59: Serial.println(Ethernet.localIP());
60: }
61:
62:
63: void loop() {
64: // listen for incoming clients
65: EthernetClient client = server.available();
66: HumidityTemperature_t ht ;
67: String strHumidityH ;
68: String strHumidityL;
69: String strTemperatureH;
70: String strTemperatureL;
71: String strBuffer ;
72:
73: if (client) {
74: Serial.println("new client");
75: // an http request ends with a blank line
76: boolean currentLineIsBlank = true;
77: while (client.connected()) { // 接続要求があったか?
78: if (client.available()) {
79: char c = client.read();
80: Serial.write(c);
81: // if you've gotten to the end of the line (received a newline
82: // character) and the line is blank, the http request has ended,
83: // so you can send a reply
84: if (c == '\n' && currentLineIsBlank) {
85: // send a standard http response header
86: client.println("HTTP/1.1 200 OK");
87: client.println("Content-Type: text/html");
88: client.println("Connection: close"); // the connection will be closed after completion of the response
89: client.println("Refresh: 5"); // refresh the page automatically every 5 sec
90: client.println();
91: client.println("<!DOCTYPE HTML>");
92: client.println("<html>");
93: client.println("<head>");
94: client.println("<title>Temperature & Humidity</title>");
95: client.println("</head>");
96:
97: GetTempHumidi(&ht) ; // 温湿度データ取得
98: strHumidityH = String( ht.HumidityH ) ;
99: strHumidityL = String( ht.HumidityL ) ;
100: strTemperatureH = String( ht.TemperatureH ) ;
101: strTemperatureL = String( ht.TemperatureL ) ;
102:
103: // 日本語表示は UTF-8
104: strBuffer = "温度(Temperature)=" ;
105: strBuffer += strTemperatureH ;
106: strBuffer += "." ;
107: strBuffer += strTemperatureL ;
108: strBuffer += " 湿度(Humidity)=" + strHumidityH ;
109: strBuffer += "." ;
110: strBuffer += strHumidityL ;
111:
112: client.print(strBuffer);
113: client.println("<br />");
114:
115: client.println("</html>");
116: break;
117: }
118: if (c == '\n') {
119: // you're starting a new line
120: currentLineIsBlank = true;
121: } else if (c != '\r') {
122: // you've gotten a character on the current line
123: currentLineIsBlank = false;
124: }
125: }
126: }
127: // give the web browser time to receive the data
128: delay(2);
129: // close the connection:
130: client.stop();
131: Serial.println("client disconnected");
132: }
133: }
134: //------------------------------------------------------------
135: // AM2321 より温度、湿度の読み込む
136: //------------------------------------------------------------
137: void GetTempHumidi(HumidityTemperature_t* ht)
138: {
139: int i ;
140: int Humidity16 ;
141: int Temperature16 ;
142:
143: // AM2321 アクセス
144: Wire.beginTransmission(I2C_AM2321);
145: Wire.write(0x00);
146: Wire.endTransmission();
147: delay(1) ;
148:
149: Wire.beginTransmission(I2C_AM2321);
150: Wire.write(0x03); // Function read register
151: Wire.write(0x00); // 0 (Top register)
152: Wire.write(0x04); // Read 4 byte
153: Wire.endTransmission();
154: delay(2) ;
155: Wire.requestFrom(I2C_AM2321, 0x08);
156: // 湿度、温度データ取得
157: i = 0;
158: while (Wire.available()) {
159: I2C_data[i++] = Wire.read();
160: }
161: // Serial.println("-------");
162: // Serial.println(I2C_data[0],HEX) ; // 機能コード 0x03
163: // Serial.println(I2C_data[1],HEX) ; // データ数 0x04
164: // Humidity 100.0% ==> 0x03E8
165: Humidity16 = (I2C_data[2] << 8) + I2C_data[3];
166: ht->HumidityH = Humidity16 / 10;
167: Serial.print("Humidity=");
168: Serial.print(ht->HumidityH); // 10進で小数点より上を表示
169: Serial.print(".");
170: ht->HumidityL = Humidity16 % 10; // 10 で除算した余り
171: Serial.print(ht->HumidityL); // 10進で小数点以下を表示
172: Serial.println("%");
173:
174: // Temperature
175: // I2C_data[4] = 0xFF ; // minus test FF83 ==> -125, FFF5 ==> -11
176: // I2C_data[5] = 0xF5 ; // minus test FF75 ==> -139
177: Temperature16 = (I2C_data[4] << 8) + I2C_data[5] ;
178: ht->TemperatureH = Temperature16 / 10;
179: Serial.print("Temperature=");
180: Serial.print(ht->TemperatureH );
181: Serial.print(".");
182: ht->TemperatureL = abs(Temperature16 % 10); // 小数点以下に符号を付けない
183: Serial.print(ht->TemperatureL);
184: Serial.println(" C");
185: }
186:
posted by white at 23:57| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。