При загрузке кода в дисплей вываливаются все значения с трех режимов и получается абракадабра.
C++:
#include "TM1637.h"
#include "GyverButton.h"
#include <iarduino_RTC.h>
#include <OneWire.h>
#define knopka1 6
#define CLK 5
#define DIO 4
byte level;
byte maxLevels = 3;
unsigned int TEMPtime, TIMEtime;
iarduino_RTC time(RTC_DS1307);
TM1637 tm1637(CLK, DIO);
GButton butt1(knopka1);
OneWire ds(10);
int8_t TIME[4];
int8_t TEMP[4];
void setup() {
tm1637.init();
time.begin();
tm1637.set(BRIGHT_TYPICAL);
Serial.begin(9600);
TEMPtime = millis();
TIMEtime = millis();
}
void loop() {
butt1.tick();
if (butt1.isClick()) {
level++;
if (level >= maxLevels) level = 0;
}
time.gettime();
// put your main code here, to run repeatedly:
switch (level) {
case 0: task_0();
case 1: task_1();
case 2: task_2();
}
}
void task_0() {
tm1637.set(BRIGHT_DARKEST);
tm1637.point(true);
}
void task_1() {
if (millis() - TIMEtime > 1000) {
tm1637.point(true);
TIME[0] = time.Hours / 10;
TIME[1] = time.Hours % 10;
TIME[2] = time.minutes / 10;
TIME[3] = time.minutes % 10;
tm1637.display(TIME);
TIMEtime = millis();
}
}
void task_2() {
if (millis() - TEMPtime > 500) {
int integrer = temp() * 10;
TEMP[0] = integrer / 100;
TEMP[1] = integrer % 100 / 10;
TEMP[2] = integrer % 10;
TEMP[3] = 0;
tm1637.display(TEMP);
}
}
float temp() {
byte i;
byte data[12];
byte present = 0;
byte type_s;
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay (50); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
return (float)celsius;
}