极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5181|回复: 1

python通过udp协议获取arduino温湿度信息

[复制链接]
发表于 2014-9-10 21:58:23 | 显示全部楼层 |阅读模式
  1. #include <DHT.h>
  2. #include <SPI.h>         // needed for Arduino versions later than 0018
  3. #include <Ethernet.h>
  4. #include <EthernetUdp.h>         // UDP library from: [email][email protected][/email] 12/30/2008

  5. #define DHTPIN 2     // what pin we're connected to
  6. #define DHTTYPE DHT11   // DHT 11

  7. // Enter a MAC address and IP address for your controller below.
  8. // The IP address will be dependent on your local network:
  9. byte mac[] = {  
  10.   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  11. IPAddress ip(192, 168, 2, 177);
  12. unsigned int localPort = 8000;      // local port to listen on

  13. // buffers for receiving and sending data
  14. char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
  15. char  ReplyBuffer[UDP_TX_PACKET_MAX_SIZE];       // a string to send back
  16. char tempBuf[UDP_TX_PACKET_MAX_SIZE];

  17. // An EthernetUDP instance to let us send and receive packets over UDP
  18. EthernetUDP Udp;
  19. DHT dht(DHTPIN, DHTTYPE);

  20. void setup() {
  21.   // start the Ethernet and UDP:
  22.   Ethernet.begin(mac,ip);
  23.   Udp.begin(localPort);
  24.   dht.begin();
  25.   Serial.begin(9600);
  26. }

  27. float getHumidity()
  28. {
  29.   float h = dht.readHumidity();
  30.   if(isnan(h))
  31.   {
  32.     return 0;
  33.   }
  34.   return h;
  35. }

  36. float getTemperature()
  37. {
  38.   float t = dht.readTemperature();
  39.   if(isnan(t))
  40.   {
  41.     return 0;
  42.   }
  43.   return t;
  44. }

  45. void loop() {
  46.   float h=0.0,t=0.0;
  47.   //float h = dht.readHumidity();
  48.   //float t = dht.readTemperature();
  49. /* if (isnan(t) || isnan(h))
  50.   {
  51.     Serial.println("Failed to read from DHT");
  52.   }
  53.   else
  54.   {
  55.     Serial.print("Humidity: ");
  56.     Serial.print(h);
  57.     Serial.print(" %\t");
  58.     Serial.print("Temperature: ");
  59.     Serial.print(t);
  60.     Serial.println(" *C");
  61.   }*/
  62.   
  63.   
  64.   // if there's data available, read a packet
  65.   int packetSize = Udp.parsePacket();
  66.   if(packetSize)
  67.   {
  68.     Serial.print("Received packet of size ");
  69.     Serial.println(packetSize);
  70.     Serial.print("From ");
  71.     IPAddress remote = Udp.remoteIP();
  72.     for (int i =0; i < 4; i++)
  73.     {
  74.       Serial.print(remote[i], DEC);
  75.       if (i < 3)
  76.       {
  77.         Serial.print(".");
  78.       }
  79.     }
  80.     Serial.print(", port ");
  81.     Serial.println(Udp.remotePort());

  82.     // read the packet into packetBufffer
  83.     Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
  84.    
  85.     switch(packetBuffer[0])
  86.     {
  87.       case '0':  //control
  88.         break;
  89.       case '1':  //informaiton
  90.         switch(packetBuffer[1])
  91.         {
  92.           case '0': //temperature and humility
  93.             switch(packetBuffer[2])
  94.             {
  95.                case '1':
  96.                  h=getHumidity();
  97.                  dtostrf(h,10,2,tempBuf);
  98.                  sprintf(ReplyBuffer,"100humidity:%s",tempBuf);
  99.                  break;
  100.               case '0':  //temperature
  101.                 t=getTemperature();
  102.                 dtostrf(t,10,2,tempBuf);
  103.                 sprintf(ReplyBuffer,"100Temperature:%s",tempBuf);
  104.                 break;

  105.               /*case :  //humility
  106.                 float h=getHumidity();
  107.                 sprintf(ReplyBuffer,"101Humidity:%f\n",h);
  108.                 break;*/
  109.             }
  110.             break;
  111.            case '1': //air controler
  112.              break;
  113.         }
  114.         break;
  115.       default:
  116.         Serial.println("Error");
  117.     }
  118.    
  119.     Serial.println("Contents:");
  120.     Serial.println(packetBuffer);
  121.     memset(packetBuffer,'\0',UDP_TX_PACKET_MAX_SIZE);

  122.     // send a reply, to the IP address and port that sent us the packet we received
  123.     Serial.println(ReplyBuffer);
  124.     Udp.beginPacket(Udp.remoteIP(),Udp.remotePort());
  125.     Udp.write(ReplyBuffer);
  126.     Udp.endPacket();
  127.   }
  128.   delay(10);
  129. }
复制代码

[pre lang="python" line="1"]from socket import *

HOST="192.168.2.177"
PORT=8000
BUFSIZE=1024
ADDR=(HOST,PORT)

udpCliSock=socket(AF_INET,SOCK_DGRAM)
while True:
    data=raw_input(">")
    if not data:
        break
    udpCliSock.sendto(data,ADDR)
    data,ADDR=udpCliSock.recvfrom(BUFSIZE)
    if not data:
        break
    print data,ADDR
udpCliSock.close()
[/code]

说明
输入100获取温度值
输入101获取湿度值
回复

使用道具 举报

发表于 2014-9-12 23:45:09 | 显示全部楼层
很新颖,眼前一亮。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 03:21 , Processed in 0.034164 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表