:: Галерия ::

Тази страница е мястото където всеки от нас може да се похвали с резултата от часовете, усилията и ентусиазма инвестирани в Проекта. Тук поставяме цели, завършени авторски проекти реализирани с помощта на Ардуино - това може да са арт проекти, хакнати или ъпгрейднати играчки, автоматизация на дома, игри и други.



Simple Temperature Data Logger (LT_M8)

Автор: Atoro (atoro@abv.bg)

LT_M8 е проект за създаване на устройство за измерване и запис на температура и/или други аналогови величини. Целта на проекта е всичко да се реализира по лесен и удобен начин, с минимум компоненти и допълнителен софтуер.

1. Хардуер

1.1. Списък на необходимите компоненти:

  • Arduino + захранване – 1 бр.;
  • USB кабел за връзка на Arduino с персонален компютър;
  • Резистор 1 kΩ – 2 бр.;
  • Резистор 2.2 kΩ – 2 бр.;
  • Резистор 10 kΩ – 2 бр.;
  • Бутон с нормално отворен контакт – 2 бр;
  • Температурен сензор LM335Z – 2 бр.;
  • I2C EEPROM 24LC256 – 2 бр;
  • Универсална платка – 1 бр.

1.2. Електрическа схема

(свали фиг. 1)

1.2.1. Свързване на Arduino

(свали фиг. 2)

Могат да се използват различни варианти на Arduino, включитено и стари версии, изградени с едночипов микроконтолер AT MEGA 8 (напр. Arduino NG).

1.2.2. Бутони

(свали фиг. 3)

Използват се външни PULL-DOWN резистори R12 и R14. Възможно е да се използват и вътрешните PULL-UP резистори на микроконтролера. Тогава трябва да се направят и съответните минимални промени и в, показаната по-долу, програма за Arduino.

Резистори R11 и R13 не са задължителни, но е желателно да се използват, като защитни (например в случай, че съответните портове се инициализират по грешка, като изводи и/или бъдат свързани неправилно).

1.2.3. Температурни сензори

(свали фиг. 4)

Използват се 2 броя аналогови температурни сензори LM335, свързани към аналогови входове A2 и А3.

Напрежението на LM335 е пропорционално на абсолютната температура (измерена в келвини K).

0 K = -273.15 C;

25 C = 298.15 K -> 2.9815V

За повече информация: тук

1.2.4. Аналогови входове A0 и A1

Към тях могат да се свържат, по аналогичен начин, още 2 температурни сензора LM335Z или да се измерват други аналогови величини, чийто сигнал е в границите (0 - 5) V DC.

1.2.5. Външна EEPROM памет

(свали фиг. 5)

Използва се външна EEPROM памет 24LC256, с обем 32kB, т.е. от 0 до 32767. Комуникацията е осъществена чрез I2C интерфейс.

Всеки чип има адрес B1010XXX. Последните 3 бита се задават, чрез изводи A0, A1 и A2 (да не се бъркат с аналоговите входовене A0, A1 и A2 на Arduino). В нашия случай оставяме изводите несвързани и адреса, който се използва при комуникация с паметта, е B1010000.

2. Софруер за Arduino.

 
/* 
 * Simple Temperature Logger
 * (nxtA 0.04 LT_M8) 
 * Rev. 4, 2012-10-07 
 * 
 * Author: Atoro 
 * Contact: atoro@abv.bg 
 * 
 * You can redistribute this software and/or modify it 
 * under the terms of the GNU General Public License. 
 * This software is distributed WITHOUT ANY WARRANTY! 
 */

#include <Wire.h> 

#define BTN_START 2 
#define BTN_PRINT 3 
#define LED_STAT 13 

#define VOLT0 0  
#define VOLT1 1 
#define TEMP0 2  
#define TEMP1 3  

#define XEE_DEV_ADDR B1010000 // 24C256 device address 
#define XEE_MEM_ADDR_MAX 32767 // For 24C256: 256 * 1024 / 8 - 1 = 32767 bytes 
#define XEE_MEM_TABLE_WIDTH 4 // Number of parameters for recording in external EEPROM 
#define XEE_MEM_LOOP_EN false // Enable/Disable restart to xEEMemAddrCntr 0 after reaching the XEE_MEM_ADDR_MAX

#define EVERY_SECOND 1000 // ms. 1000 = 1 second. 
#define LOG_INTERVAL 60 // s 

unsigned int xEEMemAddr = 0;  
unsigned int xEEMemAddrCntr = 0; 

byte temp0 = 0; 
byte temp1 = 0; 
byte volt0 = 0; 
int volt1 = 0; 

unsigned long logIntvCntr = 0; 

void setup() { 
  pinMode(BTN_START, INPUT); 
  pinMode(BTN_PRINT, INPUT); 
  pinMode(LED_STAT, OUTPUT); 

  Wire.begin();      

  Serial.begin(9600);
  Serial.println(); 

  digitalWrite(LED_STAT, HIGH); 
  Serial.println("] Press BTN_START or BTN_PRINT..."); 
  while(digitalRead(BTN_START) == LOW) 
    if(digitalRead(BTN_PRINT) == HIGH) sPrintLog(); 
  Serial.println("] Start logging:");     
  digitalWrite(LED_STAT, LOW);   
}

void loop() {
  digitalWrite(LED_STAT, HIGH); 

  if(logIntvCntr >= LOG_INTERVAL) {
    logIntvCntr = 0; 
    anRead(); // Get ADC values
    xEEWriteLog(); // Write log data in externa EEPROM 
    sPrint(); // Serial print data 
  } 

  logIntvCntr++; 
  delay(50); 
  digitalWrite(LED_STAT, LOW); 
  delay(EVERY_SECOND - 50); 
}

// *** Read and convert ADC values 
void anRead() {
  // *** Convert 10 bit ADC value to 8 bit for saving in external EEPROM   
  volt0 = analogRead(VOLT0) >> 2; 
  volt0 = checkVal(volt0); 

  volt1 = analogRead(VOLT1) >> 2; 
  volt1 = checkVal(volt1); 

  temp0 = analogRead(TEMP0) - 512; 
  temp0 = checkVal(temp0); 

  temp1 = analogRead(TEMP1) - 512; 
  temp1 = checkVal(temp1); 
}

// *** Change value 255 with 254 
byte checkVal(byte _val) {
  if(_val > 254) _val = 254; 
  return(_val); 
}

// *** Serial print log data 
void sPrintLog() { 
  byte _data = 0; 
  Serial.println("] Logged data:"); 
  for(unsigned i = 0; i < XEE_MEM_ADDR_MAX;) { 
    for(byte j = 0; j < XEE_MEM_TABLE_WIDTH; j++) { 
      Serial.print(xEERead(XEE_DEV_ADDR, i + j)); 
      Serial.print("\t"); 
    }
    Serial.println(); 
    i += XEE_MEM_TABLE_WIDTH; 
  } 
}

// *** Serial print data 
void sPrint() {
  Serial.print('>'); 
  Serial.print('\t'); 
  Serial.print(volt0); 
  Serial.print('\t'); 
  Serial.print(volt1); 
  Serial.print('\t'); 
  Serial.print(temp0); 
  Serial.print('\t'); 
  Serial.print(temp1); 
  Serial.print('\t'); 
  Serial.print(xEEMemAddr); 
  Serial.println(); 
}

// *** Recalculate external EEPROM memory address
void xEEWriteCalc() {
  if(xEEMemAddrCntr > XEE_MEM_ADDR_MAX) {
    if(XEE_MEM_LOOP_EN) xEEMemAddrCntr = 0; 
    else xEEMemAddrCntr = XEE_MEM_ADDR_MAX;
  }
  xEEMemAddr = xEEMemAddrCntr;   
  xEEMemAddrCntr++; 
}

// *** Write log data in external EEPROM 
void xEEWriteLog() { 
  for(unsigned int i = 0; i <= XEE_MEM_TABLE_WIDTH; i++) {
    xEEWriteCalc(); 
    if (i == 0) xEEWrite(XEE_DEV_ADDR, xEEMemAddr, volt0); // Write volt0   
    else if (i == 1) xEEWrite(XEE_DEV_ADDR, xEEMemAddr, volt1); // Write volt1   
    else if (i == 2) xEEWrite(XEE_DEV_ADDR, xEEMemAddr, temp0); // Write temp0 
    else if (i == 3) xEEWrite(XEE_DEV_ADDR, xEEMemAddr, temp1); // Write temp1 
    if(i == XEE_MEM_TABLE_WIDTH) { // Write EOR symbol (255) 
      xEEWrite(XEE_DEV_ADDR, xEEMemAddr, 255);
      xEEMemAddrCntr--;   
    }
  }
}

// *** Read a byte from external EEPROM 
byte xEERead(int _devAddr, unsigned int _memAddr) {
  byte _data = 0;
  Wire.beginTransmission(_devAddr);
  Wire.write((int)(_memAddr >> 8)); // MSB
  Wire.write((int)(_memAddr & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(_devAddr,1);
  if (Wire.available()) _data = Wire.read();
  return _data;
}

// *** Write a byte in external EEPROM 
void xEEWrite(int _devAddr, unsigned int _memAddr, byte _data) {
  Wire.beginTransmission(_devAddr);
  Wire.write((int)(_memAddr >> 8)); // MSB
  Wire.write((int)(_memAddr & 0xFF)); // LSB
  Wire.write(_data);
  Wire.endTransmission();
  delay(10); 
}

// *** ... and that's all :) 

Програмата се компилира до размер под 6 kB и следователно може да се зареди във всякакви варианти на Arduino, включитено и стари версии, изградени с едночипов микроконтолер AT MEGA 8 (напр. Arduino NG).

3. Описание на действието на устройството

След включване на захранването, устройството изчаква натискането на един от бутоните:

  • BTN_PRINT – Извеждане на записаните, във външната EEPROM памет, данни през серийния интерфейс. След прикличване на извеждането, устройството се връща в „изчакващ“ режим.
  • BTN_START – Стартиране на измерването и записването на аналоговите величини (A0, A1, A2 и А3). За да се изведат данните, записани във външната памет, утройството трябва да се рестартира и да се натисне BTN_PRINT. След рестарт, записът на данните започва от адрес 0x00 на външната памет.

4. Съхранение и визуализиране на данните от устройството

4.1. Съхранение

След вклюване на захранването или след рестарт, устройството преминава в изчакващ режим. Натискането на BTN_PRINT води до извеждане на записаните данни във външната EEPROM памет през серийния интерфейс.

Така получените данни могат да бъдат записани във текстови файл.

4.2. Визуализация

Работата с файлове е основна задача в програмирането. Всеки, който има познания в областта може да се справи с прочитането и обработка на данните от текстовия файл. За хората, който нямат опит и познания в сферата на програмирането на високо ниво, това може да се окаже по-трудна задача.

От друга страна, самото визуализиране на данните, под формата на графика, която позволява лесна настройка и обновяване на данните, може да се окаже задача, за чието решаване ще е необходимо повече време и усилия, от тези, които човек е склонен и има възможност да отдели.

Целта на проекта е да предложи концепция за реализация на завършеното изделие и то с инструменти, достъпни за широк кръг от хора.

4.2.1. Обработка и визуализация на данните с LibreOffice Calc

Един от най-лесните начини за обработка и визуализиране на данните е, да се използват възможностите на LibreOffice Clac или Microsoft Office Excel.

LibreOffice е офис пакет, който се разпространява свободно и безплатно за операционни системи Windows, Macintosh и GNU/Linux. Може да бъде изтеглен от http://www.libreoffice.org/.

5. Недостатъци и възможни подобрения

5.1. Захранване и консумация

Основен недостатък е, че този проект не е оптимизиран за работа с батерийно захранване.

6. Демонстрации

6.1. Температура на въздуха

(свали фиг. X.1)

Показани са стойностите на температурата на въздуха за дълъг период от време (от 10.09.2012 г. До 01.10.2012 г.). Интервала на измерване и запис на данните е една минута. Данните са сваляни и от устройството многократно, през 48 часа.



Ардотино

Ардотино в проект за игра с Ардуино. Това е вариант на задачите от детските книжки тип "свържи точките", но моливът е заменен от два потенциометъра.

Играта засега е прототип и е така замислена, че да може много лесно да се замени картинката с друга или на мястото на потенциометрите да се поставят други аналогови сензори.

За да играете е необходимо да имате инсталирани Ардуино и Processing и да свържете два потенциометъра от 10К ома към аналогови пинове 1 и 2 на Ардуино както е показано на тези снимка и схема.

След това изтеглете файла с програмите за Ардуино и Processing и го разархивирайте. Папката именувана arDotino_Arduino_v1_bg сложете в папката с Ардуино скици (обикновено се намира в My Documents), a arDotino_Processing_v1_bg сложете в папката с Processing програми - обикновено също се намира в My Dosuments. През File > Sketchbook заредете arDotino_Arduino_v1_bg в средата за програмиране на Ардуино и я качете на платката свързана към потенциометрите. Заредете arDotino_Processing_v1_bg в Processing и ако е необходимо сменете номера на серийния порт който ползвате на ред 53. Стартирайте и приятна игра!

Може да видите видео на играта в действие на YouTube.


Share