:: Галерия ::
Тази страница е мястото където всеки от нас може да се похвали с резултата от часовете, усилията и ентусиазма инвестирани в Проекта. Тук поставяме цели, завършени авторски проекти реализирани с помощта на Ардуино - това може да са арт проекти, хакнати или ъпгрейднати играчки, автоматизация на дома, игри и други.
LT_M8 е проект за създаване на устройство за измерване и запис на температура и/или други аналогови величини. Целта на проекта е всичко да се реализира по лесен и удобен начин, с минимум компоненти и допълнителен софтуер.
Могат да се използват различни варианти на Arduino, включитено и стари версии, изградени с едночипов микроконтолер AT MEGA 8 (напр. Arduino NG).
Използват се външни PULL-DOWN резистори R12 и R14. Възможно е да се използват и вътрешните PULL-UP резистори на микроконтролера. Тогава трябва да се направят и съответните минимални промени и в, показаната по-долу, програма за Arduino.
Резистори R11 и R13 не са задължителни, но е желателно да се използват, като защитни (например в случай, че съответните портове се инициализират по грешка, като изводи и/или бъдат свързани неправилно).
Използват се 2 броя аналогови температурни сензори LM335, свързани към аналогови входове A2 и А3.
Напрежението на LM335 е пропорционално на абсолютната температура (измерена в келвини K).
0 K = -273.15 C;
25 C = 298.15 K -> 2.9815V
За повече информация: тук
Към тях могат да се свържат, по аналогичен начин, още 2 температурни сензора LM335Z или да се измерват други аналогови величини, чийто сигнал е в границите (0 - 5) V DC.
Използва се външна EEPROM памет 24LC256, с обем 32kB, т.е. от 0 до 32767. Комуникацията е осъществена чрез I2C интерфейс.
Всеки чип има адрес B1010XXX. Последните 3 бита се задават, чрез изводи A0, A1 и A2 (да не се бъркат с аналоговите входовене A0, A1 и A2 на Arduino). В нашия случай оставяме изводите несвързани и адреса, който се използва при комуникация с паметта, е B1010000.
/*
* 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).
След включване на захранването, устройството изчаква натискането на един от бутоните:
След вклюване на захранването или след рестарт, устройството преминава в изчакващ режим. Натискането на BTN_PRINT води до извеждане на записаните данни във външната EEPROM памет през серийния интерфейс.
Така получените данни могат да бъдат записани във текстови файл.
Работата с файлове е основна задача в програмирането. Всеки, който има познания в областта може да се справи с прочитането и обработка на данните от текстовия файл. За хората, който нямат опит и познания в сферата на програмирането на високо ниво, това може да се окаже по-трудна задача.
От друга страна, самото визуализиране на данните, под формата на графика, която позволява лесна настройка и обновяване на данните, може да се окаже задача, за чието решаване ще е необходимо повече време и усилия, от тези, които човек е склонен и има възможност да отдели.
Целта на проекта е да предложи концепция за реализация на завършеното изделие и то с инструменти, достъпни за широк кръг от хора.
Един от най-лесните начини за обработка и визуализиране на данните е, да се използват възможностите на LibreOffice Clac или Microsoft Office Excel.
LibreOffice е офис пакет, който се разпространява свободно и безплатно за операционни системи Windows, Macintosh и GNU/Linux. Може да бъде изтеглен от http://www.libreoffice.org/.
Основен недостатък е, че този проект не е оптимизиран за работа с батерийно захранване.
Показани са стойностите на температурата на въздуха за дълъг период от време (от 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.