This repository has been archived by the owner on Sep 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTemperatureOled.ino
123 lines (110 loc) · 3.92 KB
/
TemperatureOled.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
GitHub: https://github.com/EugeneEvseenko/TemperatureOled
Eugene Evseenko, [email protected]
https://evseenko.kz/
MIT License
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <GyverOLED.h>
#include <TimerMs.h>
#include <EncButton.h>
#define ONE_WIRE_BUS 12 // пин с ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
GyverOLED<SSD1306_128x64> oled;
TimerMs tmr(5 * 60 * 1000, 1, 1); // таймер дисплея
TimerMs tempTmr(1000, 1); // таймер считывания температуры, чтение каждую секунду
EncButton<EB_TICK, 14> btn; // кнопка пробуждения
float temperature;
void setup() {
Serial.begin(115200);
tmr.setTimerMode();
tempTmr.setPeriodMode();
sensor.begin();
sensor.setResolution(11); // задержка считывания около 400 мс, при 12бит - около 800 мс
oled.init();
PrintTemperature();
}
void loop() {
btn.tick(); tmr.tick(); tempTmr.tick();
if (btn.click()) { // пробудить экран / перезапустить таймеры
PrintTemperature();
//Serial.println("click");
tempTmr.start();
oled.setPower(true);
tmr.start();
}
if (tempTmr.ready() && tmr.active()) {
PrintTemperature();
}
if (tmr.ready()) {
tempTmr.stop();
//Serial.println("turn off");
oled.setPower(false);
}
// Serial.print(tmr.active() ? " active" : " not active");Serial.print(tmr.elapsed() ? " elapsed | " : " not elapsed | ");
// Serial.print(tempTmr.active() ? " active" : " not active");Serial.println(tempTmr.elapsed() ? " elapsed" : " not elapsed");
}
void PrintTemperature() {
sensor.requestTemperatures(); // запрос температуры
temperature = sensor.getTempCByIndex(0); // чтение с первого и единственного датчика
//temperature = random(125); // для проверки
oled.clear();
oled.home();
oled.fastLineH(26, 0, 127);
oled.fastLineH(27, 0, 127);
oled.setScale(3);
String text = String(temperature, 1);
oled.setCursorXY(CalcCenter(text, 3, true), 0);
oled.println(text);
oled.setScale(2);
text = GetState(temperature);
oled.setCursorXY(CalcCenter(text, 2, false), 34);
oled.println(text);
//oled.fastLineH(54, 0, 127);oled.fastLineH(55, 0, 127);
oled.setScale(1);
oled.setCursor(0, 7);
if (text == "МАЛО") {
oled.invertText(true);
oled.fastLineH(54, 0, 42);
oled.fastLineH(55, 0, 42);
}
oled.setCursor(0, 7);
oled.print("(<78.3)");
oled.invertText(false);
if (text == "НОРМАЛЬНО") {
oled.invertText(true);
oled.fastLineH(54, 43, 96);
oled.fastLineH(55, 43, 96);
}
oled.setCursor(43, 7);
oled.print("(78.3-94)");
oled.invertText(false);
if (text == "МНОГО") {
oled.invertText(true);
oled.fastLineH(54, 97, 127);
oled.fastLineH(55, 97, 127);
}
oled.setCursor(97, 7);
oled.println("(>94)");
oled.invertText(false);
oled.update();
}
String GetState(float temp) {
if (temp < 78.3) {
return "МАЛО";
} else if ( temp >= 78.3 && temp <= 94.0) {
return "НОРМАЛЬНО";
} else {
return "МНОГО";
}
}
int CalcCenter(String text, int scale, bool mode) {
int CharOnScreen = scale == 2 ? 11.0 : 7.0; // костыль, русские символы занимают в два раза больше места
float OneCharSize = 127.0 / CharOnScreen; // сколько места занимает один символ на дисплее
float AllCharSize = OneCharSize * (text.length() / (mode ? 1.0 : 2.0)); // сколько занимают места все символы
float left = 127.0 / 2.0; float right = AllCharSize / 2;
int out = left - right;
return out; // координата по оси Х в центре дисплея
}