дуже легкий мікроконтролер низької потужності з пам'яттю?


9

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

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

Я читав, що можливо змінити arduino pro mini на менший струм, позбувшись від регулятора напруги? але, можливо, доцільніше повністю змінити і навчитися програмувати інший тип мікроконтролера, який хтось міг би порекомендувати? Керувати ним потрібно було б безпосередньо з легкої монетної комірки або подібного легкого акумулятора. (Я також не впевнений, як знайти легкий 3,3 В акумулятор для arduino pro mini, я думаю, вони існують, але поки що я можу знайти лише 3В акумулятори). Якщо він має вбудовану пам'ять, щоб економити температуру кожні кілька годин, яку можна було б завантажити пізніше, це було б ідеально (я також був би зацікавлений, якщо хтось має рекомендації щодо пам'яті). Я знаю, що можна купити "Ібутон"


... Вибачте, моє актуальне питання: Чи можу хтось порекомендувати відповідний малопотужний мікроконтролер, чи ви вважаєте, що я повинен продовжувати роботу з ардуїно і спробувати його адаптувати? Будь-яка допомога дуже цінується!
SH

Ви можете використовувати ATmega328 на частоті 8 МГц, що працює з двома батареями 1,5 В послідовно. Потім ви можете продовжити використання бібліотек Arduino та IDE.
jfpoilpret

@jfpoilpret, 2AA, я думаю, буде занадто важким. Монета 2032 3В монета може бути кращою.
Дат Ха

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

Re: "Замість світлодіода у вас може бути термістор для зчитування температури", замість цього можна прочитати ADC канал 15, вбудований датчик температури. [Однак це не дуже чутливо або точно.]
Джеймс Уолдбі - jwpat7

Ваш факел-факел - це чудова конструкція, і оцінка споживаної енергії, яку ви зробили, дуже відповідає духу "інженера стільки, скільки вам потрібно" духу Ардуніо. Вся справа зігрівала півники мого серця (де б вони не були).
cjs

8

Я б особисто запропонував ATtiny 45/85. Це майже невеликий AVR з 5 GPIO. Ви можете запрограмувати його за допомогою Arduino IDE і використовувати Arduino як провайдер. Якщо ви можете спроектувати власну PCB, версія SMD ATtiny невелика, низька та компактна. Загальна схема, щоб зробити функцію ATtiny, також мінімальна.

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

Крім того, при низькій тактовій частоті (0-4MHz) ви можете живити ATtiny напругою до 1,8 В. Можливо, ви могли навіть запустити його на 1,5 В, але це зовсім не рекомендується. Якщо ви хочете бути в безпеці, 3V-комірка монети буде невеликою, плоскою, і вона може прослужити, ймовірно, багато років. Це також трохи безпечніше порівняно з ліпосами, які мають багато ризику, особливо якщо встановити його на тварину, яку ви справді не можете контролювати.

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

Я також рекомендую компоненти SMD, якщо це можливо. Це дозволяє всім компонентам бути нижчими, і це не зашкодить і не пошкоджує шкіру людини / тварини, за якою ви стежите.


Схоже, у нас обох однакова ідея!
Нік Гаммон

Дякую!! це виглядає чудово, дуже ціную допомогу! Я спробую вивчити основи встановлення мікроконтролера тощо з першого ланцюга, і як тільки я змушу його працювати, ймовірно, зміниться на компоненти SMD, як ви запропонували. Думаю, реально мені це потрібно зробити, щоб зробити його досить маленьким.
SH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.