2016年08月22日

温度、湿度 測定+Ethernet

Ethernet (UDP) 経由で"ON" コマンドを送り、Arduino は温度と湿度を測定し結果をPC 送信します。
Ether_AM2321_2.jpg

AM2321 温湿度センサーの組込み
Arduino UNO の上に Ethernet シールドを載せています。

無題.png

以下にプログラムを晒します。(ダウンロードも可能です。)
UDP 通信部はサンプルにある UDPSendReceiveString を参照しました。
AM2321 より温度、湿度を読み込むのは I2C 通信により読み込みます。
本来は CRC 計算してデータに化けが無いこと確認するのですが、今回は省略しています。
( GitHab にはあったような? )



01: /*
02: UDPSendReceiveString:
03: This sketch receives UDP message strings, prints them to the serial port
04: and sends an "acknowledge" string back to the sender
05:
06: A Processing sketch is included at the end of file that can be used to send
07: and received messages for testing with a computer.
08:
09: created 21 Aug 2010
10: by Michael Margolis
11:
12: This code is in the public domain.
13: */
14: /*
15: Edit by kawabe 2016/08/22
16: */
17:
18: #include <SPI.h> // needed for Arduino versions later than 0018
19: #include <Ethernet.h>
20: #include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
21: // インストールしたフォルダーの配下にあります。
22: // \arduino-1.6.10\libraries\Ethernet\src\EthernetUdp.h
23: #include <Wire.h>
24:
25: #include <string.h> // for strcmp
26:
27: typedef struct {
28: int HumidityH ; // 湿度 整数
29: int HumidityL; // 湿度 小数点以下
30: int TemperatureH; // 温度 整数
31: int TemperatureL; // 温度 小数点以下
32: } HumidityTemperature_t ;
33:
34: void GetTempHumidi(HumidityTemperature_t ht) ;
35:
36: #define GREEN_LED_PIN 8
37: byte I2C_AM2321 = 0x5c ; // AM2321 I2C Slave address
38: byte I2C_data[8]; // AM2321 受信データエリア
39:
40: // Enter a MAC address and IP address for your controller below.
41: // The IP address will be dependent on your local network:
42: byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0xEB };
43: // Ethernet シールド基板の裏側にシールが貼ってあります。
44: IPAddress ip(192, 168, 100, 32);
45:
46: unsigned int localPort = 45600; // local port to listen on
47:
48: // buffers for receiving and sending data
49: #define SEND_UDP_BUFFER_MAX 16
50: char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
51: char ReplyBuffer[SEND_UDP_BUFFER_MAX] ; // a string to send back
52: String strBuffer ;
53:
54: // An EthernetUDP instance to let us send and receive packets over UDP
55: EthernetUDP Udp;
56:
57: //------------------------------------------------------------
58: // Setup
59: //------------------------------------------------------------
60: // 1.PIN 割り当て
61: // 2.Ethernet の準備
62: // 3.UDP 通信の開始
63: // 4.シリアル通信の開始 ( for Debug )
64: void setup() {
65: pinMode(GREEN_LED_PIN, OUTPUT);
66:
67: Wire.begin(); // I2C 準備
68:
69: // start the Ethernet and UDP:
70: Ethernet.begin(mac, ip);
71: Udp.begin(localPort);
72:
73: Serial.begin(9600);
74: }
75:
76: //------------------------------------------------------------
77: // Main Loop
78: //------------------------------------------------------------
79: // 1.UDP によりコマンド(ON)受信
80: // 2.温湿度読み込み指示
81: // 3.UDP で温度、湿度データを送信する。
82: void loop() {
83: int i ;
84: HumidityTemperature_t ht ;
85: String strHumidityH ;
86: String strHumidityL;
87: String strTemperatureH;
88: String strTemperatureL;
89:
90: // if there's data available, read a packet
91: int packetSize = Udp.parsePacket();
92: if (packetSize > 0) {
93: Serial.println("-------");
94: Serial.print("Received packet of size ");
95: Serial.println(packetSize);
96: Serial.print("From ");
97: IPAddress remote = Udp.remoteIP();
98: for (int i = 0; i < 4; i++) {
99: Serial.print(remote[i], DEC);
100: if (i < 3) {
101: Serial.print(".");
102: }
103: }
104: Serial.print(", port ");
105: Serial.println(Udp.remotePort());
106:
107: // read the packet into packetBufffer
108: Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
109: Serial.print("Contents:");
110: Serial.println(packetBuffer);
111: if ( strcmp( packetBuffer, "ON" ) == 0 ) { // "ON" を受信した。
112: digitalWrite(GREEN_LED_PIN, HIGH); // Green LED ON ;
113: GetTempHumidi(&ht) ; // 温湿度データ取得
114: // 温湿度データを文字列に変更
115: strHumidityH = String( ht.HumidityH ) ;
116: strHumidityL = String( ht.HumidityL ) ;
117: strTemperatureH = String( ht.TemperatureH ) ;
118: strTemperatureL = String( ht.TemperatureL ) ;
119: strBuffer = "H=" + strHumidityH ;
120: strBuffer += "." ;
121: strBuffer += strHumidityL ;
122: strBuffer += " T=" ;
123: strBuffer += strTemperatureH ;
124: strBuffer += "." ;
125: strBuffer += strTemperatureL ;
126: // strBuffer ==> ReplyBuffer コピー
127: ReplyBuffer[0] = 0 ;
128: strBuffer.getBytes( ReplyBuffer, SEND_UDP_BUFFER_MAX) ;
129: // 温湿度データを UDP により送信する。
130: Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
131: Udp.write(ReplyBuffer);
132: Udp.endPacket();
133: delay(200) ; // LED 点灯確認用
134: digitalWrite(GREEN_LED_PIN, LOW); // Green LED OFF ;
135: }
136: // Clear Buffer
137: if ( packetSize >= UDP_TX_PACKET_MAX_SIZE ) {
138: packetSize = UDP_TX_PACKET_MAX_SIZE - 1 ; // 念のため
139: }
140: for ( i = 0 ; i <= packetSize ; i ++ ) {
141: packetBuffer[i] = 0 ;
142: }
143: }
144: delay(10);
145: }
146:
147: //------------------------------------------------------------
148: // AM2321 より温度、湿度の読み込む
149: //------------------------------------------------------------
150: void GetTempHumidi(HumidityTemperature_t* ht)
151: {
152: int i ;
153: int Humidity16 ;
154: int Temperature16 ;
155:
156: // AM2321 アクセス
157: Wire.beginTransmission(I2C_AM2321);
158: Wire.write(0x00);
159: Wire.endTransmission();
160: delay(1) ;
161:
162: Wire.beginTransmission(I2C_AM2321);
163: Wire.write(0x03); // Function read register
164: Wire.write(0x00); // 0 (Top register)
165: Wire.write(0x04); // Read 4 byte
166: Wire.endTransmission();
167: delay(2) ;
168: Wire.requestFrom(I2C_AM2321, 0x08);
169: // 湿度、温度データ取得
170: i = 0;
171: while (Wire.available()) {
172: I2C_data[i++] = Wire.read();
173: }
174:
175: // Humidity 100.0% ==> 0x03E8
176: Humidity16 = (I2C_data[2] << 8) + I2C_data[3];
177: ht->HumidityH = Humidity16 / 10;
178: Serial.print("Humidity=");
179: Serial.print(ht->HumidityH); // 10進で小数点より上を表示
180: Serial.print(".");
181: ht->HumidityL = Humidity16 % 10; // 10 で除算した余り
182: Serial.print(ht->HumidityL); // 10進で小数点以下を表示
183: Serial.println("%");
184:
185: // Temperature
186: // I2C_data[4] = 0xFF ; // minus test FF83 ==> -125, FFF5 ==> -11
187: // I2C_data[5] = 0xF5 ; // minus test FF75 ==> -139
188: Temperature16 = (I2C_data[4] << 8) + I2C_data[5] ;
189: ht->TemperatureH = Temperature16 / 10;
190: Serial.print("Temperature=");
191: Serial.print(ht->TemperatureH );
192: Serial.print(".");
193: ht->TemperatureL = abs(Temperature16 % 10); // 小数点以下に符号を付けない
194: Serial.print(ht->TemperatureL);
195: Serial.println(" C");
196: }



ソースをアップします。
UDP_2_20160822.zip

反対側からの写真です。
Ether_AM2321_3.jpg

PC側は前回と同じ UDP_Connect です。(Windows で動きます。)

Uno_Ether_AM2321_PC01.jpg

@:自身のIPアドレスを設定します。
A:Arduino 側のIPアドレスを設定します。
B:今回使用するポート番号を設定します。
C:Close となっているボタンをクリックし Open させます。
D:コマンド "ON" を登録します。
E:Send ボタンを押し"ON"を送信します。
  結果は右窓に表示されます。
8:送信間隔を 5000msec(5秒)程度に設定します。
7:Repeat にチェックを入れると5秒間隔で"ON"を送信します。

PC(Windows)のソースです。(C++Builder XE5 でつくりました。)
UDP_Test_VCL_020.zip





 


posted by white at 11:39| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

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