Prototip stație meteo integrat cu un Mac
Autor: tom -07/03/2011-
Intro
În urmă cu câteva săptămâni mi-am propus să găsesc o metodă simplă de a controla modul în care îmi ud florile din balcon. Am un program foarte încărcat și, de mult ori, uit să ud plantele lucru care nu prea le priește. Mi-am luat un cititor de umiditate pentru sol, dar problema e că uit și de acela, luat fie de treburile casnice, fie de alte lucruri pe care trebuie să le rezolv serile. Singura activitate cavsi-constantă care mi-ar fi permis o monitorizare mai atentă este lucrul pe computer, serile mă conectez și lucrez câteva ore la diverse proiecte, fie de dezvoltare, fie articole pentru care am termene de predare la diverse reviste. Așadar, m-am gândit că ar fi minunat să am un mod de notificare instalat pe laptop care să mă atenționeze atunci când trebuie… să ud anumită plantă. Mi-am imaginat că pe web trebuie să existe sute de proiecte de automatizare, dar am căutat ceva simplu, fără pompe și dispozitive automate de udat. Ceva care doar să citească valorile din sol (umiditate) din aer (umiditate, temperatură) și să le trimită wireless unei aplicații tip utility (care rulează în fundal) și care avertizează vizual – prin câteva elemente de interfață – atunci când este necesar să îngrijesc o anumită plantă. Deci ce face omul când nu are treabă ? Își face de lucru. Habar nu aveam că acest proiect al meu îmi va trezi amintiri din copilărie-adolescență (vezi de pildă aici), din perioada în care electronica era una dintre marile mele pasiuni. Astfel am descoperit Arduino și am ajuns să-i cunosc pe pasionații de la RoboFun cărora le mulțumesc încă o dată pentru sprijin.
Scop și obiective
Înainte de a mă arunca într-un proiect complicat și având în vedere că sunt primii pași pe care i-am făcut în lumea microcontroller-elor, mi-am propus câteva obiective simple pentru proiectul pe care încerc să-l descriu în acest tutorial:
- Să conectez un senzor de temperatură bazat pe breakboard-ul tmp102 de la SparkFun la o platformă Arduino Uno;
- Să conectez și să învăț cum funcționează un breakboard BlueTooth; am ales dispozitivul Bluetooth Mate Gold bazat pe un modul de clasa 1 RN-41, simplu de utilizat și cu documentație excelentă.
- Să realizez primul meu program funcțional în soft-ul de la Arduino.
- Programul Arduino să permită
- citirea temperaturii de la senzor;
- trimiterea valorilor temperaturii componentei bluetooth;
- Conectarea componentei Bluetooth cu laptop-ul;
- Realizarea unui program pentru un Apple MacBook care primește informațiile prin bluetooth și le afișează în bara de meniu; programul să funcționeze în fundal, tip “utility”.
- Cam atât.
Am numit pompos aplicația “stație meteo“, de fapt un termomentru wireless integrat cu laptop-ul, dar intenționez dezvoltarea acestui proiect prin adăugarea unui senzor de presiune și a unuia de umiditate care pot furniza, împreună, mai multe informații necesare unei “stații meteo” reale.
Realizare
Conectarea breakboard-ului bluetooth; Conectarea cu laptop-ul se face prin intermediul unei interfețe Bluetooth. Am ales dispozitivul Bluetooth Mate Gold comercializat de Robofun aici:

Bluetooth Mate Gold - imagine vectorială generată pentru Fritzing. Componentele pentru proiecte Fritzing sunt incluse în subsolul articolului.
Nu voi prezenta aici informații suplimentare referitoare la setarea dispozitivului Bluetooth, acestea putând fi găsite în documentația componentei. Oricum, intenționez să tratez acest subiect într-un post separat.
Conectarea dispozitivului Bluetooth la placa Arduino se face conform diagramei de mai jos.

Conectarea pinilor dispozitivului Bluetooth Mate Gold în montajul cu senzorul de temperatură tmp102 așa cum se observă pe un dispozitiv fizic. Culorile conectorilor (firelor) corespund culorilor utilizate în proiectul fizic. Compară cu imaginea vectorială de mai sus, a convertorului logic.
Motivul pentru care am ales pinii 4 și 5 digital (PWM~) și nu pinii 0 și 1 este unul pur didactic: am vrut să testez interconectarea plăcii Arduino cu mai mulți pini digitali procedând la modificările de rigoare în codul Arduino.
Conectarea senzorului de temperatură; Senzorul de temperatură Tmp102 trebuie utilizat cu un convertizor de nivel logic deoarece senzorul de temperatură funcționează la 3.3Vcc și trebuie conectat la bus-ul I2C al platformei Arduino. Mai multe informații despre bus-ul I2C puteți citi aici (un tutorial extrem de interesant), oricum, important de reținut, comunicarea serială pe I2C se face pe 5Vcc nivel logic deci potențialul trebuie convertit la valorile utilizate (3.3Vcc) de senzorul de temperatură. În acest scop se utilizează convertizorul de nivel logic:

Logic convertor - imagine vectorială generată pentru Fritzing. Componentele pentru proiecte Fritzing sunt incluse în subsolul articolului.
Convertizorul de nivel logic este foarte ușor de folosit. Trebuie alimentat de la două surse de tensiune (voltaj mare – HV – 5Vcc și voltaj mic – LV – 3.3Vcc) pe care le folosește platforma de dezvoltare: Pinul “HV” se conectează la 5Vcc, iar pinul “LV” la 3.3Vcc; pinul “GND” se conectează la masa platformei de dezvoltare.
Pinii sunt etichetati ca intrari (Inputs) si iesiri (Outputs). Acestea sunt relative la placa. Unul digital mergand la pinul RXI pe partea cu 5V va aparea la pinul RXO pe partea cu 3,3V, drept 3,3V. Unul digital mergand la pinul TXI pe partea cu 3,3V va aparea la pinul TXO pe partea cu 5V, drept 5V. Secțiunea marcată “HV” a convertizorului se conectează la paltforma Arduino, iar secțiunea marcată “LV” la senzorul de temperatură, în felul următor:
- Pinii “TXO” la pinii 4 și 5 ai platformei Arduino;
- Pinul “HV” la pinul de +5Vcc al plăcii Arduino;
- Pinul “GND” la masă;
- Pinii “TXI” la pinii SCL și SDA; nu este important CARE dintre cei doi pini TXI, dar este important să se păstreze corespondența; astfel, pinul SCL al senzorului să fie interconectat cu platforma Arduino prin intermediul convertizorului la pinul 5 analogic al plăcii Arduino, iar pinul “SDA” al senzorului să fie interconectat cu platforma Arduino prin intermediul convertizorului la pinul 4 analogic al plăcii Arduino; vezi imaginea de mai jos:

Conectarea pinilor logic level convertor-ului în montajul cu senzorul de temperatură tmp102 așa cum se observă pe un dispozitiv fizic. Culorile conectorilor (firelor) corespund culorilor utilizate în proiectul fizic. Compară cu imaginea vectorială de mai sus, a convertorului logic.
- Pinul “LV” al convertizorului se conectează la pinul 3,3Vcc al plăcii Arduino, iar al doilea pin “GND” tot la masă.
Elemente de montaj; imaginile de mai jos ilustrează pas cu pas montarea prototipului într-o carcasă de plastic, utilizând și un mini breadboard pentru conectarea firelor. Mini breadboard-ul se potrivește la fix în spațiul rezervat bateriei, din interiorul carcasei de plastic:

Montarea mini-breadboard-ului în carcasă. Acesta se potrivește perfect în spațiul rezervat bateriei.

Montarea plăcii Arduino Uno și conectoarele pentru Bluetooth (sus), alimentare (firele roșii la 3,3 și 5 Vcc), masă (firul negru) și bus-ul I2C (dreapta jos).

Dispozitivul Bluetooth și Logic Convertor-ul montate pe mini-breadboard văzute din partea opusă, acolo unde se vor monta firele de legătură în breadboard.
Codul Arduino; Pentru colectarea informațiilor generate de senzorul de temperatură, procesarea și transmiterea către interfața Bluetooth am utilizat următorul cod-sursă în aplicația Arduino:
#include
#include
#define TMP102_I2C_ADDRESS 72
byte firstbyte, secondbyte; //bytes pentru intreg si fractie
int val; //integer pentru temperatura
#define btRxPin 4 //definire pin rx bluetooth
#define btTxPin 5 //definire pin tx bluetooth
NewSoftSerial BlueTooth(btRxPin,btTxPin); //obiect pentru conexiune seriala
void setup()
{
Serial.begin(115200); //setare baud pentru serial
BlueTooth.begin(115200); //setare baud pentru bluetooth
Wire.begin();
pinMode(btRxPin, INPUT); //setare intrare digitala
pinMode(btTxPin, OUTPUT); //setare iesire digitala
BlueTooth.println("Conectare BlueTooth reusita..."); //daca se conecteaza disp
//bluetooth anunta succesul
delay(1000);
}
void getTemp102() {
Wire.beginTransmission(TMP102_I2C_ADDRESS);
Wire.send(0x00);
Wire.endTransmission();
Wire.requestFrom(TMP102_I2C_ADDRESS, 2);
Wire.endTransmission();
firstbyte = Wire.receive(); /* valori intregi */
secondbyte = Wire.receive(); /* valori fractionale */
float convertedTemp;
float correctedTemp;
val = ((firstbyte) << 4); //concateneaza valoarea - step 1
val |= (secondbyte >> 4); //step 2
Serial.println((float)val*0.0625); //verifica temp la terminal
convertedTemp = float(val) * 0.0625; //converteste la float
correctedTemp = convertedTemp - 5; //corecteaza eroarea
/* verifica primul byte la terminalul serial */
Serial.print("primul byte este ");
Serial.print("\t");
Serial.println(firstbyte,BIN);
/* verifica al doilea byte la terminalul serial */
Serial.print("al doilea byte este ");
Serial.print("\t");
Serial.println(secondbyte,BIN);
/* verifica string-ul serial final la terminalul serial */
Serial.print("concatenated byte is ");
Serial.print("\t");
Serial.println(val,BIN);
/* verifica temperatura la terminalul serial */
Serial.print("Converted temp is ");
Serial.print("\t");
Serial.println(convertedTemp);
/* verifica temperatura corectata la terminalul serial */
Serial.print("Corrected temp is ");
Serial.print("\t");
Serial.println(correctedTemp);
BlueTooth.println(correctedTemp); //trimite la dispozitivul Bluetooth
}
/* intra in executie */
void loop() {
getTemp102();
delay(5000);
}
/* end */
Rezultate – integrarea cu Mac OS X; Nu voi intra în detalii de programare deoarece acestea depășesc scopul prezentului articol. Cine este interesat poate posta un comentariu și voi da detaliile cerute.
Aplicația este dezvoltată pe o platformă Mac OS X 10.6.6 și este extrem de simplă, de tip “utility”, care funcționeaă în fundal și afișează temperatura curentă în bara de status. Afișarea se modifică doar la modificarea temperaturii:

Aplicația, așa cum apare în bara de status pe un laptop MacBook cu SO OS X 1.0.6.6. În dreapta este prezentată localizarea în limba română.
Concluzii
Proiectul discutat aici pe scurt este un prototip de stație meteo. Pentru simplitate am redus scopul la integrarea cu un singur senzor de temperatură deoarece am urmărit în principal un obiectiv didactic – acela de a învăța primii pași în universul microcontroller-elor.
Continuarea este dezvoltarea conceptului prin includerea mai multor senzori (presiune și umiditate), cuplarea cu o interfață ethernet (pentru accesarea informațiilor prin web) și dezvoltarea conceptului la un al doilea proiect, acela de controller de umiditate pentru solul plantelor din balcon.
Arduino Uno , bluetooth , Bluetooth Mate Gold , Cocoa , I2C , Mac OSX , serial , tmp102 , wireless Vezi aici detalii complete.














Catalin
March 7th, 2011
Am facut eu asa ceva insa nu am avut timp sa postez pe TR. Am folostit modulele TX-RX de pe Robofun si shieldul ethernet. M-am oprit la citirea temperaturii de la mai multi senzori din locatii diferite. Daca vrei putem lua legatura sa finalizam proiectul, br Catalin
FlorinV
March 11th, 2011
Salut,
Felicitari pentru articol, foarte frumos scris. Faina aplicatia!
Spor in continuare.
Numai bine,
Florin
Florin Cojocariu
October 4th, 2011
Felicitari, e simplu si bine documentat. Eu as vrea sa fac o automatizare pentru gradina, impartita pe cateva zone, fiecare cu senzori de temperatura si umiditate. Te-ar interesa sa colaboram?
Concurs Robofun 2012 | Robofun Blog
February 5th, 2012
[...] sunt cateva proiecte care noua ni se par interesante din punct de vedere al prezentarii – Statie meteo cu Mac, ROBOTL – robot cu retele neurale, Animatronic Hand, Swirl, Smart Home Management System, [...]