очень легкий микроконтроллер с низким энергопотреблением и памятью?

9

Я построил несколько проектов с использованием Arduino. Для нового проекта я хочу записать температуру поверхности кожи в зависимости от времени (возможно, несколько раз в день) и, возможно, другую легкую информацию, такую ​​как напряжение.

Мне нужно сделать все как можно меньше и легче (так как это будет измерять температуру кожи у маленького млекопитающего), то есть ниже 5 г, если возможно, легче, в идеале 3 г, включая батарею, чтобы она не расстраивала 50- 100 г животного слишком много.

Я читал, что возможно было бы изменить Arduino Pro Mini, чтобы использовать меньше тока, избавившись от регулятора напряжения? но, возможно, более разумно полностью измениться и научиться программировать микроконтроллеры другого типа, которые кто-то может порекомендовать? Должно быть возможно управлять им напрямую от легкого монетного элемента или аналогичного легкого аккумулятора. (Я также не уверен, как найти легкую 3,3 В батарею для Arduino Pro Mini, я думаю, что они существуют, но я пока могу найти только 3 В батареи). Если бы он имел встроенную память для сохранения температуры каждые несколько часов, которую можно было бы загрузить позже, это было бы идеально (мне также было бы интересно, если у кого-то есть рекомендации по памяти). Я знаю, что можно купить "Ibutton"

SH
источник
... извините, мой настоящий вопрос таков: может ли кто-нибудь порекомендовать подходящий маломощный легкий микроконтроллер, или вы думаете, что мне следует продолжить с Arduino и попытаться адаптировать его? Любая помощь очень ценится!
SH
Вы можете использовать ATmega328 с тактовой частотой 8 МГц, работающий от двух последовательных батарей по 1,5 В. Затем вы можете продолжить использовать библиотеки Arduino и IDE.
jfpoilpret
@jfpoilpret, 2AA было бы слишком тяжело, я думаю. Ячейка монеты на 20 В 332 могла бы быть лучше.
Дат
2
В зависимости от того, как вы его запрограммируете, ATmega328 или ATtiny84 или 85 могут потреблять очень мало тока и работать с литиевой батареей CR2032 довольно долго. Однако снижение энергопотребления схемы (ATmel или любой другой) может стать довольно сложным.
jfpoilpret

Ответы:

15

Я сделал небольшой локатор факела, который использовал ATtiny85, питающийся от кнопки (CR2032). Это выглядит так:

Факел локатор

Другая сторона:

Другая сторона

Это в настоящее время весит 5,9 г. Держатель батареи весит 1,6 г, поэтому вы можете сэкономить, сделав более легкий держатель (возможно, немного пластика для изоляции и припаяя непосредственно к батарее). Гнездо для микросхемы весит не менее 0,5 г, так что вы можете сохранить его, припаяв к контактам процессора. Таким образом, мы до 3,8 г.

ATtiny85 имеет 512 байт EEPROM, которые вы можете использовать для записи показаний. Я не уверен насчет часов, если вы пытаетесь сэкономить вес, но если вы запустите их в известное время, вы можете получить разумную оценку времени, используя millis()функцию для поиска миллисекунд с момента запуска.

Я сделал еще один, который мигает светодиод каждые пару секунд:

Светодиодная вспышка

Это похоже. Там есть процессор (вверх дном под гнездом для микросхемы), а батарея внизу. Это весит 6 г. Батарея прослужила пару лет, и каждые пару секунд мигает светодиод!

Вместо светодиода у вас может быть термистор для считывания температуры.

Вы можете запрограммировать чтение каждые несколько часов и сохранить его в EEPROM. Затем при получении инструкции (например, путем соединения нескольких контактов) он может выводить показания на другой вывод (через последовательный порт).

Вы могли бы сэкономить больше веса, используя SMD-устройства (для поверхностного монтажа), и, возможно, используя крошечную печатную плату, которую вы могли бы изготовить.


Код

Код для моего поиска факела ниже. Интересно то, что он спит большую часть времени. Также он спит во время дискретизации АЦП. Хотя в моем случае я измеряю 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 
Ник Гаммон
источник
для вашей мигающей светодиодной «вещи», не лучше ли использовать 555 чип таймера? Я считаю использование ATtiny чем-то напрасным.
Дата Ха
2
Я шел на низкое энергопотребление. Процессор большую часть времени спит, а затем мигает светодиод в течение миллисекунды или около того.
Ник Гэммон
Спасибо! Похоже, можно использовать это, узнаем, как настроить и запрограммировать его.
SH
«Вместо светодиода у вас может быть термистор для считывания температуры», вместо этого можно прочитать канал 15 АЦП, встроенный датчик температуры. [Однако это не очень чувствительный или точный.]
Джеймс Уолдби - jwpat7
Ваш искатель факелов - это замечательный образец дизайна, и оценка энергопотребления, которую вы сделали, в значительной степени соответствует духу «инженера столько, сколько вам нужно» духа Ардунио. Все это согревало мои сердца (где бы они ни были).
cjs
8

Я бы лично предложил ATtiny 45/85. Это довольно маленький AVR с 5 GPIO. Вы можете запрограммировать его в Arduino IDE и использовать Arduino в качестве интернет-провайдера. Если вы можете создать свою собственную печатную плату, SMT-версия ATtiny будет маленькой, низкой и компактной. Общая схема для выполнения функции ATtiny также минимальна.

введите описание изображения здесь

Кроме того, на низкой тактовой частоте (0–4 МГц) вы можете питать ATtiny при напряжении всего 1,8 В. Вы могли бы даже запустить его на 1,5 В, но это не совсем рекомендуется. Если вы хотите быть в безопасности, ячейка монеты 3 В будет маленькой, плоской, и может длиться, вероятно, много лет. Это также немного безопаснее по сравнению с липосами, которые имеют большой риск, особенно если вы устанавливаете его на животное, которое вы не можете контролировать.

введите описание изображения здесь

Я также рекомендовал бы компоненты SMD, если это возможно. Это позволяет всем компонентам быть ниже, и это не повреждает и не царапает кожу человека / животного, за которым вы наблюдаете.

Дат Ха
источник
Похоже, у нас обоих была одна и та же идея!
Ник Гэммон
Спасибо!! это выглядит великолепно, очень ценю помощь! Я постараюсь изучить основы того, как настроить микроконтроллер и т. Д. С первого контура, и как только я его заработаю, вероятно, изменится на компоненты SMD, как вы предложили. Я думаю, что реально мне нужно будет сделать это, чтобы сделать его достаточно маленьким.
SH