Termometru cu DS18B20 si afisare pe 3 digiti LED
Dorind ca sa-mi realizez singur un termometru cu DS18B20 si afisare pe 3 digiti LED. m-am decis ca sa il realizez sub mediul Arduino, asa aveam surse de inspiratie, mai ales ca este primul proiect cu multiplexare digiti LED.
Tot cautand pe net, nu am gasit un proiect complet care sa faca ceea ce doream eu.
Am inceput prin crearea unui mic cod:
#include <SevenSeg.h>
#include <OneWire.h>
#include <DallasTemperature.h>
SevenSeg disp (8, 10, 6, 4, 3, 9, 7);
const int numOfDigits = 4;
int digitPins [ numOfDigits ] = { A2, A3, A4, A5};
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
disp . setDigitPins ( numOfDigits , digitPins );
disp . setDPPin (5) ;
sensors.begin();
disp.setDutyCycle(90);
disp.setRefreshRate(6000);
}
void loop() {
sensors.requestTemperatures();
disp . write (sensors.getTempCByIndex(0), 1) ;
disp.setRefreshRate(9000);
}
Codul era ok, dar la afisarea temperaturii pe afisajul cu 3 digiti LED, aparea un licarit/fliker destul de enervant prin acea "palpaire"a afisajului.
Tot "sapand"pe net si citind exemplele prezentate in Arduino, am ajuns la urmatorul cod, cod care NU mai are acel licarit/fliker enervant, dar se pierde totusi din stralucirea afisajului.
Atat digitii cat si segmentele de la afisaje sunt acum alimentate direct din pinii Arduino. Am sa testez alimentarea digitilor cu tranzistori, asa sper ca sa cresc stralucirea digitilor.
//
// Sample of using Async reading of Dallas Temperature Sensors
//
SevenSeg disp (8, 10, 6, 4, 3, 9, 7);
const int numOfDigits = 4;
int digitPins [ numOfDigits ] = { A2, A3, A4, A5};
int resolution = 9;
unsigned long lastTempRequest = 0;
int delayInMillis = 0;
float temperature = 0.0;
//
// SETUP
//
void setup(void)
{
disp . setDigitPins ( numOfDigits , digitPins );
disp . setDPPin (5) ;
disp.setRefreshRate(7000);
sensors.begin();
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(tempDeviceAddress, resolution);
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
delayInMillis = 750 / (1 << (9 - resolution));
lastTempRequest = millis();
}
void loop(void)
{
if (millis() - lastTempRequest >= delayInMillis) // waited long enough??
{
sensors.requestTemperatures();
temperature = sensors.getTempCByIndex(0);
disp. write ((temperature), 1);
disp. setRefreshRate(7000);
}
}
Am facut si un mic clip cu functionarea termometrului folosind codul de mai sus:
Voi reveni cu detalii dupa ce avansez cu proiectul.
Niciun comentariu:
Trimiteți un comentariu