数码之家

 找回密码
 立即注册
搜索
查看: 4287|回复: 28

低成本低功耗无线通讯的单片机用什么方案

[复制链接]
发表于 2021-4-18 10:41:48 来自手机浏览器 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
咨询一下大家,我想做几个探头,检测花盆湿度、温度之类的数据,布线又不方便,所以要采用无线方案、纽扣电池供电,最好能半年换一次电池。能支持低功耗、无线通讯、低成本的单片机方案用什么好呢?
发表于 2021-4-18 12:24:20 | 显示全部楼层
对体积没那么严格的追求地话,用18650这些供电有啥问题?
回复 支持 反对

使用道具 举报

发表于 2021-4-18 14:14:34 | 显示全部楼层
51822,mesh组网
回复 支持 反对

使用道具 举报

发表于 2021-4-18 14:47:00 | 显示全部楼层
一分钟唤醒一次,不需要低功耗的。
回复 支持 反对

使用道具 举报

发表于 2021-4-19 11:54:34 | 显示全部楼层
kkstun 发表于 2021-4-18 14:47
一分钟唤醒一次,不需要低功耗的。

花盆温湿度可以有更加长的时间间隔,每天一二十次的数据就够了,植物不在乎那一两个小时
回复 支持 反对

使用道具 举报

发表于 2021-4-19 12:13:16 | 显示全部楼层
yiguangqiang 发表于 2021-4-19 11:54
花盆温湿度可以有更加长的时间间隔,每天一二十次的数据就够了,植物不在乎那一两个小时 ...

那就更省电了。每半小时或者一小时唤醒一次,用433或者2.4g芯片发送数据到室内接收器接收下。stm8s或者n76e003,掉电模式6-7ua。
回复 支持 反对

使用道具 举报

发表于 2021-4-19 14:48:59 | 显示全部楼层
通信芯片用nrf24L01随便配个能休眠的单片机就行了。

如果你非要带通讯的单片机,那就nrf24Le1。和上面的通讯芯片兼容互同。就是有点贵了。
回复 支持 反对

使用道具 举报

发表于 2021-4-19 17:10:23 | 显示全部楼层
nrf24Le1  我有但在板上的  :lol:
回复 支持 反对

使用道具 举报

发表于 2021-4-19 20:05:55 | 显示全部楼层
MSP430就可以,反正场合来看任务不复杂,实时性要求不高,可以不需要太高的性能,去换取低功耗。
至于通信模块,可以考虑使用低功耗型号,然后加一个FET控制其电源,工作时FET开启,配置好模块后直接发数据。完成发送后FET关闭模块掉电,MSP430休眠,这样可以尽可能降低功耗。
回复 支持 反对

使用道具 举报

发表于 2021-4-20 10:13:29 | 显示全部楼层
我们有现成的开发案例,一有成品了。

低功耗,自唤醒+温度采集。
回复 支持 反对

使用道具 举报

发表于 2021-4-20 22:39:50 | 显示全部楼层
ESP8266呗   
回复 支持 2 反对 0

使用道具 举报

发表于 2021-4-21 15:09:01 | 显示全部楼层

确实,把ESP6266的深度休眠用上,就是最便宜的方案了。尤其是布网成本。
回复 支持 2 反对 0

使用道具 举报

发表于 2021-5-15 18:46:13 | 显示全部楼层
ESP6266 + mqtt
回复 支持 反对

使用道具 举报

发表于 2021-5-15 20:30:27 | 显示全部楼层
PMS150G 省電模式 3v小於1ua(這是otp一次燒錄的)

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2021-5-18 18:28:56 | 显示全部楼层
我怎么记得8266深度休眠后只能通过其他单片机唤醒,不能自己醒呢。。。
回复 支持 反对

使用道具 举报

发表于 2021-5-19 08:36:37 | 显示全部楼层
firseve 发表于 2021-5-18 18:28
我怎么记得8266深度休眠后只能通过其他单片机唤醒,不能自己醒呢。。。

8266深度休眠后只能通过 RST 引脚的电平唤醒,你可以用其他单片机触发,这个没错。

但是8266深度休眠后,自己有一个引脚,可以在设定的延时时间之后,发出一个唤醒电平。只要把这两个引脚连起来,就能定时自动唤醒了 。
回复 支持 反对

使用道具 举报

发表于 2021-5-19 09:11:19 | 显示全部楼层
fryefryefrye 发表于 2021-5-19 08:36
8266深度休眠后只能通过 RST 引脚的电平唤醒,你可以用其他单片机触发,这个没错。

但是8266深度休眠后, ...

8266 用 arduino 编程能深度休眠吗?我想定时15秒休眠,1秒工作。是否有参考的代码,网上找了一圈,都没找到。
回复 支持 反对

使用道具 举报

发表于 2021-5-19 15:22:10 | 显示全部楼层
本帖最后由 fryefryefrye 于 2021-5-19 16:08 编辑
freegps 发表于 2021-5-19 09:11
8266 用 arduino 编程能深度休眠吗?我想定时15秒休眠,1秒工作。是否有参考的代码,网上找了一圈,都没 ...

可以。
只不过唤醒之后,几乎相当于重新启动,所有的内存数据都丢了。
只有一个rtcUserMemory的信息是可以保留,所以睡眠之前,要把关键数据保存一下。
CpuSleepTime单位是 秒。

  1. struct {
  2.         uint32_t crc32;
  3.         unsigned long 关键数据
  4. } rtcData;

  5. void setup()
  6. {      
  7.                  
  8.         Serial.begin(115200);

  9.         WiFi.disconnect();
  10.         WiFi.mode(WIFI_OFF);
  11.         WiFi.forceSleepBegin();



  12.         //Read data after sleep
  13.         if (ESP.rtcUserMemoryRead(0, (uint32_t*)&rtcData, sizeof(rtcData))) {
  14.                 uint32_t crcOfData = calculateCRC32(((uint8_t*)&rtcData.crc32)+4, sizeof(rtcData)-4);
  15.                 if (crcOfData != rtcData.crc32) {
  16.                         Serial.println("CRC32 in RTC memory doesn't match CRC32 of data. Data is probably Not OK!");
  17.                         初始化关键数据
  18.                 }
  19.                 else {
  20.                         Serial.println("CRC32 check ok, data is probably OK.");
  21.                         关键数据可以使用了
  22.                 }
  23.         }
  24. }

  25. void GotoSleep()
  26. {
  27.         // Update CRC32 of data
  28.         rtcData.crc32 = calculateCRC32(((uint8_t*)&rtcData.crc32) + 4, sizeof(rtcData)-4);
  29.         // Write struct to RTC memory
  30.         ESP.rtcUserMemoryWrite(0, (uint32_t*)&rtcData, sizeof(rtcData));
  31.         ESP.deepSleep(CpuSleepTime * 1e6);//休眠xx秒
  32. }
复制代码




打赏

参与人数 1家元 +20 收起 理由
wenxueroom + 20 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-5-19 21:01:24 | 显示全部楼层
不知道楼主的养花环境,感觉花盆湿度采样一般般的每天早晨一次,精确些的早晚各一次就足够了,这个时间段检测出来数据如果需要浇水就直接控制浇水了,其他时段也不适合给花浇水的,至于温度貌似不用时时监控吧。
回复 支持 反对

使用道具 举报

发表于 2021-5-20 11:27:32 | 显示全部楼层
fryefryefrye 发表于 2021-5-19 15:22
可以。
只不过唤醒之后,几乎相当于重新启动,所有的内存数据都丢了。
只有一个rtcUserMemory ...

感谢你啊,测试成功!结合你的代码和系统自带的例子,目前手动RST测试成功,下一步引GP16至RST,就能自动唤醒。



  1. struct {
  2.   uint32_t crc32;           //4 bytes
  3.   byte data[2];           //useful data,512-4=508 bytes
  4. } rtcData;

  5. void setup() {
  6.   //手动开机或自动唤醒开机后,开始执行下面的代码
  7.   pinMode(2, OUTPUT);
  8. //打开板载LED灯
  9.   digitalWrite(2,LOW);
  10.   
  11.   Serial.begin(38400);
  12.   Serial.println();
  13.   delay(500);

  14.   // Read struct from RTC memory
  15.   if (ESP.rtcUserMemoryRead(0, (uint32_t*) &rtcData, sizeof(rtcData)))
  16.   {                         //read to rtcData successfully
  17.     Serial.println("Read to rtcData: ");
  18.     printMemory();
  19.     Serial.println();
  20.    
  21.    
  22.     Serial.print("CRC32 read from RTC: ");
  23.     Serial.println(rtcData.crc32, HEX);

  24.     uint32_t crcOfData = calculateCRC32((uint8_t*) &rtcData.data[0], sizeof(rtcData.data));
  25.     Serial.print("Calced CRC32 of data: ");
  26.     Serial.println(crcOfData, HEX);
  27.    
  28.     if (crcOfData != rtcData.crc32)
  29.     {
  30.       Serial.println("CRC32 in RTC memory doesn't match CRC32 of data. Data is probably invalid!");

  31.       rtcData.data[0]= 0 ;
  32.       rtcData.data[1]= 0 ;
  33.     }
  34.     else
  35.     {
  36.       Serial.println("CRC32 check ok, data is probably valid.");
  37.     }
  38.   }

  39.   // Generate new data set for the struct
  40.   for (size_t i = 0; i < sizeof(rtcData.data); i++) {
  41.     // rtcData.data[i] = random(0, 128);
  42.   }

  43.    rtcData.data[0] ++;
  44.   
  45.   // Update CRC32 of data
  46.   rtcData.crc32 = calculateCRC32((uint8_t*) &rtcData.data[0], sizeof(rtcData.data));
  47.   Serial.print("Calced CRC32 of new data: ");
  48.   Serial.println(rtcData.crc32, HEX);
  49.   
  50.   // Write struct to RTC memory
  51.   if (ESP.rtcUserMemoryWrite(0, (uint32_t*) &rtcData, sizeof(rtcData))) {
  52.     Serial.println("Write: ");
  53.     printMemory();
  54.     Serial.println();
  55.   }
  56.   
  57.   digitalWrite(2,HIGH); // 关LED
  58.   Serial.println("Going into deep sleep for 10 seconds");
  59.   delay(700);

  60.   digitalWrite(2,LOW);  //开LED
  61.   delay(500);

  62.   WiFi.mode(WIFI_OFF);
  63.   ESP.deepSleep(10*1e6);     //相当于关机,10秒后自动开机
  64. }
复制代码



本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 17:50 , Processed in 0.358801 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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