Tak też będzie i na tym blogu, jako że to pierwszy prawdziwy wpis.
Jednak całość zbudowana jest nie do testów lecz jako działający na co dzień termometr.
Pomiar temperatury jest ważny w każdej dziedzinie. Warto znać aktualną wartość temperatury gdy mamy wyjść z domu. Wprowadzając się do nowego mieszkania z moją kochaną Narzeczoną brakowało nam termometru który wskazywałby temperaturę na zewnątrz.
Ale ja nie dam rady ? Potrzymaj mi piwo !
Zmajstrowałem termometr z tego co miałem pod ręką. Dodałem kilka bajerów i działa!
-Wyświetlanie skrajnych wartości temperatury i zapis do pamięci EEPROM(nieulotna po zaniku zasilania)
-Zasilanie bateryjne
-Pomiar dokonuje się co 2 minuty i Atmega przechodzi w stan uśpienia
-Podświetlenie ekranu jest odizolowane od mikroprocesora i może być załączone podczas uśpienia
Co będziemy potrzebowali aby zbudować taki sam :
-Arduino pro mini
-Czujnik temperatury DS18B20 z wodoodporną końcówką
-Wyświetlacz z Nokii 5110
-Przycisk
-Przełącznik ON/OFF
-Rezystory 4,7k i 1k
-Ogniwa LiIon 18650
-Układ do ładowania ogniw wraz z zabezpieczeniem
-Przetwornica podwyższająca napięcie (step-up) 5V
-Płytka uniwersalna i przewody.
Rys.2 Połączenie Ogniwa z ładowarką
Wyjścia OUT+ i OUT- łączymy analogicznie z + i - wejścia przetwornicy podwyższającej napięcie (5V) , wyjścia zaś do Vcc i Gnd Arduino.
Całość została zamontowana w obudowie kupionej w casto za 4zł :)
6 akumulatorów 18650 pochodzą z odzysku z starych baterii laptopowych.
Pobór prądu :
- podczas pomiaru 16mA (za przetwornicą), 30,05mA (przed przetwornicą)
- podczas uśpienia 225µA (za przetwornicą), 93µA (przed przetwornicą)
Aby zaoszczędzić trochę energii wylutowałem z płytki arduino pro mini diodę sygnalizującą zasilanie.
Jeżeli ktoś chciałby uczynić termometr bardziej energooszczędnym to można:
- uruchomić atmegę na wbudowanym kwarcu (8mhz)
- pominąć przetwornicę stepup i zasilić całość od 2,7 do 4,2V z ogniw 18650
Najwyższy i najniższy pomiar jest zapisywany do pamięci EEPROM tak żeby po wyłączeniu zasilania, znane były ostatnie skrajne wartości.
Kod programu :
//deklaracja potrzebnych bibliotek
#include <LCD5110_Graph.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "LowPower.h"
#include <EEPROM.h>
//deklaracja pinu do którego podłączony jest czujnik ds18b20
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LCD5110 lcd(9,8,7,5,6); // deklaracja wyświetlacza i pinów
extern uint8_t PO[];
extern uint8_t tempicon[];
extern uint8_t SmallFont[];
extern unsigned char TinyFont[];
extern unsigned char BigNumbers[];
double odczyt;
double maks ;
double mini ;
char miniT[6];
char maksT[6];
char temp[6];
void setup() {
sensors.begin();
lcd.InitLCD();
lcd.clrScr();
lcd.drawBitmap(0,0,PO,84,48);
lcd.update();
//EEPROM.write(4, 8); //Pierwsze wpisanie "maksymalnej" wartosci
//EEPROM.write(3, 0); //Pierwsze wpisanie "minimalnej" wartosci
maks = EEPROM.read(4); //odczytanie z eeprom maksymalnej wart
mini = EEPROM.read(3);
if(mini!=0){
mini=mini*(-1);
}
delay(3000);
}
void loop() {
//if(millis() % 10000 == 0){
sensors.requestTemperatures();
odczyt=sensors.getTempCByIndex(0);
if(odczyt<mini){mini=odczyt;EEPROM.write(3, odczyt);}
if(odczyt>maks){maks=odczyt;EEPROM.write(4, odczyt);}
dtostrf(mini, 3, 1, miniT);
dtostrf(maks, 3, 1, maksT);
dtostrf(odczyt, 3, 1, temp);
lcd.clrScr();
lcd.drawBitmap(-2,0,tempicon,39,48);
lcd.setFont(TinyFont);
lcd.print("min :",40,0);
lcd.print(miniT,62,0);
lcd.setFont(BigNumbers);
lcd.print(temp,28,10);
lcd.setFont(TinyFont);
lcd.print("max :",40,40);
lcd.print(maksT,62,40);
lcd.update();
sleepForTwoMinutes();
}
void sleepForTwoMinutes()
{
for(int i=0;i<15;i++)
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
Aby wszystko działało prawidłowo, należy w folderze załączyć plik z grafikami. Gdyż wyświetlacz pokazuje ikonkę termometru.Wszystkie pliki i biblioteki załączone są na dole posta.
Jeśli miałbym coś zmienić w kolejnej wersji projektu to dodałbym :
Kod programu :
//deklaracja potrzebnych bibliotek
#include <LCD5110_Graph.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "LowPower.h"
#include <EEPROM.h>
//deklaracja pinu do którego podłączony jest czujnik ds18b20
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LCD5110 lcd(9,8,7,5,6); // deklaracja wyświetlacza i pinów
extern uint8_t PO[];
extern uint8_t tempicon[];
extern uint8_t SmallFont[];
extern unsigned char TinyFont[];
extern unsigned char BigNumbers[];
double odczyt;
double maks ;
double mini ;
char miniT[6];
char maksT[6];
char temp[6];
void setup() {
sensors.begin();
lcd.InitLCD();
lcd.clrScr();
lcd.drawBitmap(0,0,PO,84,48);
lcd.update();
//EEPROM.write(4, 8); //Pierwsze wpisanie "maksymalnej" wartosci
//EEPROM.write(3, 0); //Pierwsze wpisanie "minimalnej" wartosci
maks = EEPROM.read(4); //odczytanie z eeprom maksymalnej wart
mini = EEPROM.read(3);
if(mini!=0){
mini=mini*(-1);
}
delay(3000);
}
void loop() {
//if(millis() % 10000 == 0){
sensors.requestTemperatures();
odczyt=sensors.getTempCByIndex(0);
if(odczyt<mini){mini=odczyt;EEPROM.write(3, odczyt);}
if(odczyt>maks){maks=odczyt;EEPROM.write(4, odczyt);}
dtostrf(mini, 3, 1, miniT);
dtostrf(maks, 3, 1, maksT);
dtostrf(odczyt, 3, 1, temp);
lcd.clrScr();
lcd.drawBitmap(-2,0,tempicon,39,48);
lcd.setFont(TinyFont);
lcd.print("min :",40,0);
lcd.print(miniT,62,0);
lcd.setFont(BigNumbers);
lcd.print(temp,28,10);
lcd.setFont(TinyFont);
lcd.print("max :",40,40);
lcd.print(maksT,62,40);
lcd.update();
sleepForTwoMinutes();
}
void sleepForTwoMinutes()
{
for(int i=0;i<15;i++)
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
Aby wszystko działało prawidłowo, należy w folderze załączyć plik z grafikami. Gdyż wyświetlacz pokazuje ikonkę termometru.Wszystkie pliki i biblioteki załączone są na dole posta.
Jeśli miałbym coś zmienić w kolejnej wersji projektu to dodałbym :
- panel słoneczny do ładowania ogniw
- pomiar aktualnego napięcia na ogniwach i wyświetlanie go
Mam nadzieję że projekt się spodobał i został opisany dość zrozumiale. Pytania proszę zadawać w komentarzach !
Pliki i biblioteki
Brak komentarzy:
Prześlij komentarz