带存储器的超轻型低功耗微控制器?


9

我已经使用arduino构建了几个项目。对于一个新项目,我想记录皮肤表面温度与时间的关系(每天可能只记录几次),以及其他容易获得的信息,例如电压。

我需要将所有东西都做得尽可能小巧轻便(因为这将测量小型哺乳动物的皮肤温度),即低于5克,如果可能的话,更轻,最好是3克(包括电池),以免使50- 100g动物太多。

我读到有可能通过摆脱电压调节器来改变arduino pro mini以使用更少的电流吗?但是也许完全改变并学习编程某人可能会推荐的另一种类型的微控制器更为明智?可能需要使用轻巧的纽扣电池或类似的轻巧电池直接操作它。(我也不确定如何为arduino pro mini找到重量轻的3.3V电池,我想它们已经存在,但到目前为止我只能找到3V电池)。如果它具有每隔几个小时即可保存温度的板载内存,可以稍后再下载,那将是理想的选择(如果有人对内存提出建议,我也很感兴趣)。我知道有可能购买“ Ibutton”


...抱歉,我的实际问题是:有人可以推荐一款合适的低功耗轻量级微控制器,还是您认为我应该继续使用arduino并尝试对其进行调整?任何帮助都非常感谢!
2016年

您可以使用8MHz的ATmega328,它由两节串联的1.5V电池供电。然后,您可以继续使用Arduino库和IDE。
jfpoilpret

@jfpoilpret,我认为2AA太重了。2032 3V纽扣电池可能会更好。
Dat Ha

2
根据您的编程方式,ATmega328或ATtiny84或85的电流消耗可能很小,并且可以与锂CR2032电池一起工作相当长的时间。但是,降低电路(ATmel或任何其他电路)的功耗会变得非常棘手。
jfpoilpret

Answers:


15

我组成了一个小的火炬定位器,它使用了由纽扣电池(CR2032)供电的ATtiny85。看起来像这样:

火炬定位器

另一边:

另一边

目前重量为5.9克。电池座的重量为1.6克,因此您可以通过制造重量更轻的电池座(也许用一点塑料进行绝缘,然后直接焊接到电池上)来节省重量。芯片插槽的重量至少为0.5g,因此您也可以通过焊接到处理器引脚上来节省重量。因此我们降至3.8克。

ATtiny85具有512字节的EEPROM,可用于记录读数。我不确定时钟是否要减轻重量,但是如果在已知时间启动时钟,则可以使用该millis()函数查找自启动以来的毫秒数,从而可以合理地估算时间。

前一阵子我又做了一个,每隔几秒钟就会闪烁一个LED:

LED闪光灯

那是相似的。处理器在那里(倒置在芯片插槽下面),电池在下面。重量为6克。电池已经使用了几年,每隔几秒钟就会闪烁一个LED!

可以使用热敏电阻代替LED来读取温度,而不是LED。

您可以将其编程为每隔几个小时读取一次,然后将其保存到EEPROM。然后,根据指示(例如通过连接几个引脚),它可以将读数输出到另一个引脚(通过串行)。

使用SMD(表面安装)设备可以节省更多的重量,也许还可以使用组成很小的电路板来节省重量。


我的火炬定位器的代码如下。有趣的是,它大部分时间处于休眠状态。它还在ADC采样期间休眠。尽管在我的情况下,我正在测量LDR(光敏电阻),但用于测量热敏电阻的代码却与此类似。您只需要在最后进行一些计算即可将读数转换为温度。

// ATtiny85 torch detector
// Author: Nick Gammon
// Date: 25 February 2015

// ATMEL ATTINY 25/45/85 / ARDUINO
// Pin 1 is /RESET
//
//                  +-\/-+
// Ain0 (D 5) PB5  1|    |8  Vcc
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1 
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
//            GND  4|    |5  PB0 (D 0) pwm0
//                  +----+

/*

  Pin 2 (PB3) <-- LDR (GL5539) --> Pin 7 (PB2) <----> 56 k <----> Gnd

  Pin 5 (PB0) <---- LED ---> 100 R <-----> Gnd

*/


#include <avr/sleep.h>    // Sleep Modes
#include <avr/power.h>    // Power management
#include <avr/wdt.h>      // Watchdog timer

const byte LED = 0;          // pin 5 
const byte LDR_ENABLE = 3;   // pin 2
const byte LDR_READ = 1;     // Ain1 (PB2) pin 7
const int LIGHT_THRESHOLD = 200;  // Flash LED when darker than this

 // when ADC completed, take an interrupt 
EMPTY_INTERRUPT (ADC_vect);

// Take an ADC reading in sleep mode (ADC)
float getReading (byte port)
  {
  power_adc_enable() ;
  ADCSRA = bit (ADEN) | bit (ADIF);  // enable ADC, turn off any pending interrupt

  // set a2d prescale factor to 128
  // 8 MHz / 128 = 62.5 KHz, inside the desired 50-200 KHz range.

  ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); 

  if (port >= A0)
    port -= A0;

#if defined(__AVR_ATtiny85__)  
  ADMUX = (port & 0x07);  // AVcc   
#else   
  ADMUX = bit (REFS0) | (port & 0x07);  // AVcc   
#endif

  noInterrupts ();
  set_sleep_mode (SLEEP_MODE_ADC);    // sleep during sample
  sleep_enable();  

  // start the conversion
  ADCSRA |= bit (ADSC) | bit (ADIE);
  interrupts ();
  sleep_cpu ();     
  sleep_disable ();

  // reading should be done, but better make sure
  // maybe the timer interrupt fired 

  // ADSC is cleared when the conversion finishes
  while (bit_is_set (ADCSRA, ADSC))
    { }

  byte low  = ADCL;
  byte high = ADCH;

  ADCSRA = 0;  // disable ADC
  power_adc_disable();

  return (high << 8) | low;

  }  // end of getReading

// watchdog interrupt
ISR (WDT_vect) 
{
   wdt_disable();  // disable watchdog
}  // end of WDT_vect

#if defined(__AVR_ATtiny85__)  
  #define watchdogRegister WDTCR
#else
  #define watchdogRegister WDTCSR
#endif

void setup ()
  {
  wdt_reset();  
  pinMode (LED, OUTPUT);
  pinMode (LDR_ENABLE, OUTPUT);
  ADCSRA = 0;            // turn off ADC
  power_all_disable ();  // power off ADC, Timer 0 and 1, serial interface
  }  // end of setup

void loop ()
  {
  // power up the LDR, take a reading
  digitalWrite (LDR_ENABLE, HIGH);
  int value = getReading (LDR_READ);
  // power off the LDR
  digitalWrite (LDR_ENABLE, LOW);

  // if it's dark, flash the LED for 2 mS
  if (value < LIGHT_THRESHOLD)
    {
    power_timer0_enable ();
    delay (1);  // let timer reach a known point
    digitalWrite (LED, HIGH);
    delay (2); 
    digitalWrite (LED, LOW);
    power_timer0_disable ();
    }

  goToSleep ();
  }  // end of loop

void goToSleep ()
  {
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  noInterrupts ();       // timed sequence coming up

  // pat the dog
  wdt_reset();  

  // clear various "reset" flags
  MCUSR = 0;     
  // allow changes, disable reset, clear existing interrupt
  watchdogRegister = bit (WDCE) | bit (WDE) | bit (WDIF);
  // set interrupt mode and an interval (WDE must be changed from 1 to 0 here)
  watchdogRegister = bit (WDIE) | bit (WDP2) | bit (WDP1) | bit (WDP0);    // set WDIE, and 2 seconds delay

  sleep_enable ();       // ready to sleep
  interrupts ();         // interrupts are required now
  sleep_cpu ();          // sleep                
  sleep_disable ();      // precaution
  }  // end of goToSleep 

对于闪烁的LED“事物”,使用555计时器芯片会更好吗?我发现使用ATtiny有点浪费。
Dat Ha

2
我打算降低功耗。处理器大部分时间处于休眠状态,然后使LED闪烁一毫秒左右。
尼克·加蒙

谢谢!看起来有可能使用它,将去学习如何设置和编程它。
2016年

关于“您可以用一个热敏电阻代替LED来读取温度”,而是可以读取ADC通道15(板载温度传感器)。[但是它不是高度敏感或准确。]
James Waldby-jwpat7

您的火炬查找器是一个很棒的设计,您所做的功耗估算非常符合Ardunio的“所需工程师多”的精神。整个事情温暖着我心中的鸟蛤(无论它们在哪里)。
cjs

8

我会个人建议ATtiny 45/85。它几乎是一个带有5个GPIO的小型AVR。您可以使用Arduino IDE对其进行编程,并将Arduino作为ISP使用。如果您可以设计自己的定制PCB,则ATtiny的SMD版本体积小,体积小且紧凑。实现ATtiny功能的总电路也很小。

在此处输入图片说明

同样,在低时钟速度(0-4MHz)下,您可以以低至1.8V的电压为ATtiny供电。您甚至可以在1.5V的电压下运行它,但是不完全建议这样做。如果您想安全起见,则3V纽扣电池将小而扁平,并且可以使用很多年。与具有很多风险的脂质相比,它也更安全一些,特别是如果将其安装在您无法控制的动物身上。

在此处输入图片说明

如果可能的话,我也建议使用SMD组件。它使所有成分都降低了,并且不会伤害或刺伤您正在监视的人/动物的皮肤。


看起来我们俩都有相同的想法!
尼克·加蒙

谢谢!!这看起来很棒,非常感谢您的帮助!我将尝试从第一个电路中学习如何设置微控制器等的基础知识,一旦我开始工作,它可能会按照您的建议更改为SMD组件。实际上,我认为我需要这样做以使其足够小。
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.