:: Галерия ::
Тази страница е мястото където всеки от нас може да се похвали с резултата от часовете, усилията и ентусиазма инвестирани в Проекта. Тук поставяме цели, завършени авторски проекти реализирани с помощта на Ардуино - това може да са арт проекти, хакнати или ъпгрейднати играчки, автоматизация на дома, игри и други.
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.