I have a code in which I am trying to use a 10K thermistor as a temperature sensor (ATMEGA 168). I use external 3.3V regulated Analog Reference and You can see the rest in the code. The problem is, after I get my temperature as a float, I truncate it into an integer to display on my two-digit seven-segment display. And sometimes it fluctuates a lot between, say, 24 and 25 *C. I want this to be removed somehow, alter the digits after the decimal because I need only a solid integer. I tried taking more readings and averaging them out, but this slows my sketch down and the multiplexing of the six-digit seven-segment display I have attached does not work anymore and we see flickering. I hope you can steer me back on track ![]()
The code:
/* Final kernel for my clock. Author: Kiril Golov (c) 2014
The circuit uses a RTC - the DS1307; a 10K thermistor to sense ambient temperature;
as well as a six-digit seven-segment-display. It alternates showing the time and then the
temperature. Segments (A - G) are wired through a NPN transistor into Digital Pins 2-9
and the common anodes (6) are wired through a PNP transistor into Digital Pins 10, 11, 12, 13, 15 and 16.
Thermistor is wired into A0, and RTC is wired into A4 and A5. */
// -------- START ---------
// libraries includes - I2C communication(Wire) + RTC library
#include <Wire.h>
#include "RTClib.h"
// declare RTC
RTC_DS1307 RTC;
// declare some constants and variables for the segments and their pins
const int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int displayPins[] = {10, 11, 12, 13, A1, A2};
const int secondled = A3;
byte digits[10][8] = {
// a b c d e f g .
{ 1, 1, 1, 1, 1, 1, 0, 0}, // 0
{ 0, 1, 1, 0, 0, 0, 0, 0}, // 1
{ 1, 1, 0, 1, 1, 0, 1, 0}, // 2
{ 1, 1, 1, 1, 0, 0, 1, 0}, // 3
{ 0, 1, 1, 0, 0, 1, 1, 0}, // 4
{ 1, 0, 1, 1, 0, 1, 1, 0}, // 5
{ 1, 0, 1, 1, 1, 1, 1, 0}, // 6
{ 1, 1, 1, 0, 0, 0, 0, 0}, // 7
{ 1, 1, 1, 1, 1, 1, 1, 0}, // 8
{ 1, 1, 1, 1, 0, 1, 1, 0} // 9
};
byte digitsDot[10][8] = {
// a b c d e f g .
{ 1, 1, 1, 1, 1, 1, 0, 1}, // 0
{ 0, 1, 1, 0, 0, 0, 0, 1}, // 1
{ 1, 1, 0, 1, 1, 0, 1, 1}, // 2
{ 1, 1, 1, 1, 0, 0, 1, 1}, // 3
{ 0, 1, 1, 0, 0, 1, 1, 1}, // 4
{ 1, 0, 1, 1, 0, 1, 1, 1}, // 5
{ 1, 0, 1, 1, 1, 1, 1, 1}, // 6
{ 1, 1, 1, 0, 0, 0, 0, 1}, // 7
{ 1, 1, 1, 1, 1, 1, 1, 1}, // 8
{ 1, 1, 1, 1, 0, 1, 1, 1} // 9
};
byte digitOth[2][8] = {
{ 0, 0, 0, 0, 0, 0, 0, 0}, // all off
{ 1, 0, 0, 1, 1, 1, 0, 0} // C
};
// declare variables for the time and temperature readings storage
int hours;
int hourd[2];
int minutes;
int minuted[2];
int date;
int dated[2];
int months;
int monthd[2];
int ledState = LOW;
long previousMillis = 0;
long interval = 500;
int degree;
int degreed[2];
// define constants for the thermistor
#define THERMISTORPIN A0
#define THERMISTORNOMINAL 10000
#define TEMPERATURENOMINAL 25
#define NUMSAMPLES 3
#define BCOEFFICIENT 3950
#define SERIESRESISTOR 10000
int samples[NUMSAMPLES];
// -------- SETUP ---------
void setup () {
// RTC and I2C initialise
Wire.begin();
RTC.begin();
// set RTC if not already set
if (!RTC.isrunning()){
//RTC.adjust(DateTime(__DATE__, __TIME__));
}
// Thermistor setup
analogReference(EXTERNAL);
// Segments setup
for (int i=0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
for (int i=0; i < 6; i++) {
pinMode(displayPins[i], OUTPUT);
}
pinMode(secondled, OUTPUT);
digitalWrite(secondled, LOW);
}
// --------- LOOP ---------
void loop () {
// get time from RTC
DateTime now = RTC.now();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(secondled, ledState);
}
hours = now.hour();
minutes = now.minute();
if (hours < 10) {
hourd[0] = 0;
hourd[1] = hours;
} else {
hourd[1] = hours % 10;
hourd[0] = (hours - hourd[1]) / 10;
}
if (minutes < 10) {
minuted[0] = 0;
minuted[1] = minutes;
} else {
minuted[1] = minutes % 10;
minuted[0] = (minutes - minuted[1]) / 10;
}
getTemperature(degreed);
updateDisplayTime(hourd[0], hourd[1], minuted[0], minuted[1], degreed[0], degreed[1]);
}
void updateDisplayTime(int value1, int value2, int value3, int value4, int value5, int value6) {
digitalWrite(displayPins[0], 0);
digitalWrite(displayPins[1], 1);
digitalWrite(displayPins[2], 1);
digitalWrite(displayPins[3], 1);
digitalWrite(displayPins[4], 1);
digitalWrite(displayPins[5], 1);
setSegments(value1);
delay(3);
digitalWrite(displayPins[0], 1);
digitalWrite(displayPins[1], 0);
digitalWrite(displayPins[2], 1);
digitalWrite(displayPins[3], 1);
digitalWrite(displayPins[4], 1);
digitalWrite(displayPins[5], 1);
setSegments(value2);
delay(3);
digitalWrite(displayPins[0], 1);
digitalWrite(displayPins[1], 1);
digitalWrite(displayPins[2], 0);
digitalWrite(displayPins[3], 1);
digitalWrite(displayPins[4], 1);
digitalWrite(displayPins[5], 1);
setSegments(value3);
delay(3);
digitalWrite(displayPins[0], 1);
digitalWrite(displayPins[1], 1);
digitalWrite(displayPins[2], 1);
digitalWrite(displayPins[3], 0);
digitalWrite(displayPins[4], 1);
digitalWrite(displayPins[5], 1);
setSegments(value4);
delay(3);
digitalWrite(displayPins[0], 1);
digitalWrite(displayPins[1], 1);
digitalWrite(displayPins[2], 1);
digitalWrite(displayPins[3], 1);
digitalWrite(displayPins[4], 0);
digitalWrite(displayPins[5], 1);
setSegments(value5);
delay(3);
digitalWrite(displayPins[0], 1);
digitalWrite(displayPins[1], 1);
digitalWrite(displayPins[2], 1);
digitalWrite(displayPins[3], 1);
digitalWrite(displayPins[4], 1);
digitalWrite(displayPins[5], 0);
setSegments(value6);
delay(3);
}
void setSegments(int n){
for (int i=0; i < 8; i++){
digitalWrite(segmentPins[i], digits[n][i]);
}
}
void setSegmentsDot(int n){
for (int i=0; i < 8; i++) {
digitalWrite(segmentPins[i], digitsDot[n][i]);
}
}
void getTemperature(int* temp) {
uint8_t i;
float average;
for (i=0; i< NUMSAMPLES; i++) {
samples[i] = analogRead(THERMISTORPIN);
delayMicroseconds(200);
}
average = 0;
for (i=0; i< NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
float steinhart;
steinhart = average / THERMISTORNOMINAL;
steinhart = log(steinhart);
steinhart /= BCOEFFICIENT;
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15);
steinhart = 1.0 / steinhart;
steinhart -= 273.15;
int degreesz = (int) steinhart;
if (degreesz < 0) {
degreesz = 0;
}
if (degreesz > 99) {
degreesz = 99;
}
if (degreesz < 0) {
temp[0] = 0;
temp[1] = degreesz;
} else {
temp[1] = degreesz % 10;
temp[0] = (degreesz - temp[1]) / 10;
}
}