极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20727|回复: 11

Microduino小应用之二

[复制链接]
发表于 2012-12-11 01:20:11 | 显示全部楼层 |阅读模式
本帖最后由 zcbzjx 于 2012-12-11 08:11 编辑

由于Microduino-nRF24L01+模块调试出现问题,今天早上改进的pcb才到,下午才调试通。
一、Microduino模块介绍
由于物联网应用各种模块需求量比较大,重复应用比较多,所以这次所有模块都是自己设计,打板,焊接的。主要模块为Microduino-Core,Microduino-FT232R,Microduino-Enc28J60(与Microduino-HR911105A模块构成完成的模块),Microduino-nRF24L01(为了阅读方便后文对模块名称省略前面的Microduino),这些模块通过Microduino总线进行叠加,以上模块及总线如下图所示。

-Core模块为Arduino系统的核心最小系统,模块设计为支持Atmeg88/168/328系列TQFP32封装单片机,支持3.3V和5V两种电压供电,本文选用328p单片机,采用5V供电,晶振频率为16MHZ。Bootloader采用Arduino UNO的,用Arduino UNO 使用ArduinoISP程序用Arduino IDE对-Core烧写。本文程序使用的IDE版本为1.0.2。
-FT232R模块为USB转串口模块,主要作用为给单片机下载程序,以及在程序调试过程中对一些过程、变量进行监控。调试结束后,如果应用不进行串口通讯,这个模块为非必须的。
-ENC28J60模块和-HR911105A模块叠加一起构成一个有线网络模块,他们之间由内部6根专有的排针进行通讯。这样设计是出于成本及不影响外观考虑的,-Enc28J60和后续推出的Microduino-HLJ6115ANL模块可以构成一个简单poe网络模块,该模块占用SPI接口(D11,D12,D13),片选CS为D8。本文程序采用EtherCard库。
-nRF24L01+模块为无线通讯模块,同样占用SPI接口(D11,D12,D13),CE为D9,片选CSN为D10。本文程序采用RF24Network库。各个模块占用引脚如下图所示:


二、Microduino模块组建物联网。
一)硬件
由于采用模块叠加方式,硬件很容易连接,-FT232R和-Core和-ENC28J60(含-HR911105A)和-nRF24L01+叠加组成网关,-FT232R-Core和-nRF24L01+叠加组成数据采集节点。网关通过-ENC28J60模块连接到Internet网络,通过nRF24L01+模块与其他节点通讯。各节点将传感器采集的数据通过-nRF24L01模块上传到网关。-FT232R模块仅在调试过程中作为下载程序和给模块供电用,实际应用供电以及传感器电路,集成到主板(洞洞板),该模块非必须。本文由于时间关系,未连接传感器电路,节点以0-100.0的随机数作为传感器数据上传到网关。-nRF24L01可以1对多通讯,由于时间关系,也仅1个节点为例。硬件连接如下图所示:


二)软件
1、节点端
节点端主要把传感器数据(本文为0.0-100.0随机数)发送到网关。代码如下:
  1. #include <RF24Network.h>
  2. #include <RF24.h>
  3. #include <SPI.h>

  4. // nRF24L01(+) radio attached using Getting Started board
  5. RF24 radio(9,10);

  6. // Network uses that radio
  7. RF24Network network(radio);

  8. // Address of our node
  9. const uint16_t this_node = 1;

  10. // Address of the other node
  11. const uint16_t other_node = 0;

  12. // How often to send 'hello world to the other unit
  13. const unsigned long interval = 15000; //ms

  14. // When did we last send?
  15. unsigned long last_sent;

  16. // How many have we sent already
  17. //unsigned long packets_sent;

  18. // Structure of our payload
  19. struct payload_t
  20. {
  21.   uint32_t ms;
  22.   uint32_t sensorData;
  23. };
  24. uint32_t temp;
  25. void setup(void)
  26. {
  27.   Serial.begin(57600);
  28.   Serial.println("RF24Network/examples/helloworld_tx/");

  29.   SPI.begin();
  30.   radio.begin();
  31.   network.begin(/*channel*/ 90, /*node address*/ this_node);
  32.   randomSeed(analogRead(0));
  33. }

  34. void loop(void)
  35. {
  36.   // Pump the network regularly
  37.   network.update();

  38.   // If it's time to send a message, send it!
  39.   unsigned long now = millis();
  40.   if ( now - last_sent >= interval  )
  41.   {
  42.     last_sent = now;

  43.     Serial.print("Sending...");
  44.     temp = random(0,1000);
  45.     payload_t payload = { millis(),temp};
  46.     RF24NetworkHeader header(/*to node*/ other_node);
  47.     bool ok = network.write(header,&payload,sizeof(payload));
  48.     if (ok)
  49.       Serial.println("ok.");
  50.     else
  51.       Serial.println("failed.");
  52.   }
  53. }
复制代码
2、网关端
网关主要把通过-nrf24L01模块接收到的传感器信息通过-ENC28J60模块传送到Yeelink服务器。代码如下:
  1. #include <RF24Network.h>
  2. #include <RF24.h>
  3. #include <SPI.h>
  4. #include <EtherCard.h>

  5. // nRF24L01(+) radio attached using Getting Started board
  6. RF24 radio(9,10);
  7. // Network uses that radio
  8. RF24Network network(radio);

  9. // Address of our node
  10. const uint16_t this_node = 0;

  11. // Address of the other node
  12. const uint16_t other_node = 1;

  13. // Structure of our payload
  14. struct payload_t
  15. {
  16.   uint32_t ms;
  17.   uint32_t sensorData;
  18. };

  19. // ethernet interface mac address
  20. static byte mymac[] = {
  21.   0x74,0x69,0x69,0x2D,0x30,0x31 };

  22. // remote website name
  23. char website[] PROGMEM = "api.yeelink.net";
  24. char urlBuf[] PROGMEM = "/v1.0/device/XXXX/sensor/XXXX/datapoints";
  25. char apiKey[] PROGMEM = "U-ApiKey: XXXXXXXXXXXXXXXXXXXXXXX";

  26. byte Ethernet::buffer[700];
  27. static long timer;
  28. uint32_t temp;
  29. // called when the client request is complete
  30. static void my_result_cb (byte status, word off, word len) {
  31.   Serial.print("<<< reply ");
  32.   Serial.print(millis() - timer);
  33.   Serial.println(" ms");
  34.   Serial.println((const char*) Ethernet::buffer+off);
  35. }




  36. void setup(void)
  37. {
  38.   Serial.begin(57600);
  39.   Serial.println("RF24Network/examples/helloworld_rx/");

  40.   SPI.begin();
  41.   radio.begin();
  42.   network.begin(/*channel*/ 90, /*node address*/ this_node);

  43.   Serial.println("\n[getDHCPandDNS]");
  44.   
  45.   if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
  46.     Serial.println( "Failed to access Ethernet controller");

  47.   if (!ether.dhcpSetup())
  48.     Serial.println("DHCP failed");

  49.   ether.printIp("My IP: ", ether.myip);
  50.   // ether.printIp("Netmask: ", ether.mymask);
  51.   ether.printIp("GW IP: ", ether.gwip);
  52.   ether.printIp("DNS IP: ", ether.dnsip);

  53.   if (!ether.dnsLookup(website))
  54.     Serial.println("DNS failed");
  55.   ether.printIp("Server: ", ether.hisip);
  56. }

  57. void loop(void)
  58. {
  59.   // Pump the network regularly
  60.   network.update();
  61.   ether.packetLoop(ether.packetReceive());
  62.   // Is there anything ready for us?
  63.   while ( network.available() )
  64.   {
  65.     // If so, grab it and print it out
  66.     RF24NetworkHeader header;
  67.     payload_t payload;
  68.     network.read(header,&payload,sizeof(payload));
  69.     temp=payload.sensorData;
  70.     Serial.print("Received Sensor Data #");
  71.     Serial.print(temp);
  72.     Serial.print(" at ");
  73.     Serial.println(payload.ms);
  74.     Serial.println("\n>>> REQ");
  75.     static char buf[20];
  76.     get_send_string(buf);
  77.     if (!ether.dnsLookup(website))
  78.       Serial.println("DNS failed");
  79.     ether.printIp("Server: ", ether.hisip);
  80.     timer = millis();
  81.     ether.httpPost (urlBuf, website, apiKey, buf, my_result_cb);
  82.    
  83.   }
  84. }
  85. void get_send_string(char *p){
  86.   uint32_t Tc_100 = temp;
  87.   Serial.println(Tc_100);
  88.   uint8_t whole, fract;
  89.   whole = Tc_100/10 ;  // separate off the whole and fractional portions
  90.   fract = Tc_100 % 10;
  91.   sprintf(p,"{"value":%d.%d}",whole,fract);
  92. }
复制代码
数据记录见yeelink


三、结语
这里仅简单给个Microduino模块在物联网的一个应用,以后会用Microduino组成传感器网络,并对各个节点进行控制。时间关系,视频以后再传。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2012-12-11 07:17:38 | 显示全部楼层
张老师,折腾到半夜啊,真辛苦!

啥时候出货,我来二斤。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-11 08:13:19 | 显示全部楼层
恩,基本上每天只有5小时睡眠,昨天弄完还看了几集《犬夜叉》才睡着了。。{:soso_e113:}
回复 支持 反对

使用道具 举报

发表于 2012-12-11 08:38:30 | 显示全部楼层
干喜欢的事,比打鸡血还管用,介就是男人。

我对分布网络很感兴趣,啥时候请老师给大家介绍介绍吧。一方面,出于移动测试点,比如室内室外,供电容易解决,但是网络不是很方便。另外一方面,出于安全隔离考虑,比家庭功耗,比较容易通过485或者模块得到数据,但是连接网络,多少有风险,毕竟是业余产品。
回复 支持 反对

使用道具 举报

发表于 2012-12-11 09:27:06 | 显示全部楼层
张老师这套arduino小玩意总算要登场了啊。
加油
回复 支持 反对

使用道具 举报

发表于 2012-12-11 09:37:22 | 显示全部楼层
张老师 威武
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-11 10:07:30 | 显示全部楼层
muggle 发表于 2012-12-11 08:38
干喜欢的事,比打鸡血还管用,介就是男人。

我对分布网络很感兴趣,啥时候请老师给大家介绍介绍吧。一方 ...

一起探索吧,应该会和enc28j60一样出个系列教程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-11 10:09:28 | 显示全部楼层
erjiang 发表于 2012-12-11 09:27
张老师这套arduino小玩意总算要登场了啊。
加油

Yeelink更新下呗。。。俺说的进度条控制。。。更加友好的Arduino客户端。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-11 10:10:45 | 显示全部楼层
幻生幻灭 发表于 2012-12-11 09:37
张老师 威武

希望能在你的盒仔上有应用。。nrf无线控制应该可以搞!
回复 支持 反对

使用道具 举报

发表于 2012-12-11 10:48:45 | 显示全部楼层
zcbzjx 发表于 2012-12-11 10:10
希望能在你的盒仔上有应用。。nrf无线控制应该可以搞!

嘿嘿,支持小型化的主控

只是不知道Microduino对以下支持有啥想法
1.IIC扩展(A4,A5)
2.PWM电机调速(看来只剩下D5,D6,见过有IIC驱动的电机,但难度系数未测)
3.服务器局域网自组网
回复 支持 反对

使用道具 举报

发表于 2012-12-11 10:54:13 | 显示全部楼层
模焊接完成,用牙刷沾着工业酒精刷洗一下,卖相会好很多,也能减少后期腐蚀。

我的一百瓦光伏,每天有几百瓦时,有充足的能量,就缺有效的无线传输。
回复 支持 反对

使用道具 举报

发表于 2013-5-4 00:26:40 | 显示全部楼层
muggle 发表于 2012-12-11 10:54
模焊接完成,用牙刷沾着工业酒精刷洗一下,卖相会好很多,也能减少后期腐蚀。

我的一百瓦光伏,每天有几 ...

wifi 蓝牙 都是有效的方式
当然 传输方式多种多样。只要能适合设计方案都是好的传输方式
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 04:17 , Processed in 0.046317 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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