Dělám teploměr s DS18B20, ATmega8 a led displejem.
Teploměr by měl zobrazovat teplotu s jedním desetinným místem po desetinách °C. A taky zápornou teplotu.
V Arduinu jsem sesmolil, dle mých chabých znalostí programování, nějaký kód,
ale nefunguje tak jak jsem si to představoval.
Teplota se zobrazuje bez desetinného místa a bliká (0,5/0,5s). Vím, že toto blikání asi způsobuje funkce "millis()",
ale nedokážu se s tím domluvit i když čerpám z různých webů zabývajících se touto funkcí.
Pomozte mi prosím tento program dotáhnout do funkčního stavu.
Děkuji za každou odezvu.
Kód: Vybrat vše
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
const unsigned long eventInterval = 1000;
unsigned long previousTime = 0;
void setup() {
Serial.begin(9600);
sensor.begin();
byte numDigits = 4;
byte digitPins[] = {A5, A4, A3, A2}; //d1,d2,d3,d4
byte segmentPins[] = {2, 13, 6, 4, 3, 12, 7, 5}; //A,B,C,D,E,F,G,DP
bool resistorsOnSegments = true; // 'false' znamená, že rezistory jsou na digitálních pinech
byte hardwareConfig = COMMON_CATHODE; // See README.md for options COMMON_ANODE/COMMON_CATHODE
bool updateWithDelays = true; // Ve výchozím nastavení se doporučuje použít 'false'
bool leadingZeros = false; // Pokud chcete zachovat úvodní nuly, použijte 'true'
bool disableDecPoint = false; //Použijte "true", pokud vaše desetinná tečka neexistuje nebo není připojena.
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90); //value between -200 and 200. 0 to 100 is the standard range
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - previousTime >= eventInterval) {
previousTime = currentTime;
sensor.setResolution(11);
sensor.requestTemperatures();
float tempC = sensor.getTempCByIndex(0);
Serial.println(tempC);
sevseg.setNumber(tempC, 1);
}
sevseg.refreshDisplay(); // Must run repeatedly
}