Уважаемые, проблема такая: к ардуино нано подключены энкодер, датчик температуры (через чип MAX6675), oled дисплей для вывода. Данные с датчика верно снимаются при старте программы, а далее обновляются не каждый цикл (как это было задумано), а только при совершении каких-либо действий с энкодером (только тех действий, которые влияют на ветвления в программе). Код является основой для дальнейшей разработки, так что все элементы в нём нужны, хоть пока и не используются как нужно.
При выводе данных в serial данные обновляются каждый цикл, но значения меняются только при задействовании энкодера. Отсюда делаю вывод, что по какой-то причине не перезаписывается переменная realTemp (лежит в функции printing). Уже третий день туплю, никак не могу понять, в чем проблема.
Собсна, код:
#include <TimerOne.h>
#include "max6675.h"
#include <iarduin
LED_txt.h>
#include "GyverEncoder.h"
#define SW 10
#define DT 11
#define CLK 12
Encoder enc1(CLK, DT, SW);
iarduin
LED_txt myOLED(0x78);
extern uint8_t MediumFontRus[];
extern uint8_t SmallFontRus[];
int thermoDO = 4;
int thermoCS = 3;
int thermoCLK = 2;
int setTemp = 200;
bool clk = 0;
int setTime = 0;
int oldSetTime = 999;
int oldRealTemp = 0;
int oldSetTemp = 0;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
void setup() {
enc1.setType(TYPE2);
pinMode(SW, INPUT_PULLUP);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
myOLED.begin();
myOLED.setFont(MediumFontRus);
myOLED.print("Разжигаем", OLED_C, 3);
myOLED.print("Духовку", OLED_C, 5);
//ждем стабилизации чипа MAX
delay(5000);
myOLED.clrScr();
myOLED.print( "C = ", 0, 3);
myOLED.print( "C = ", 0, 5);
myOLED.print( "T = ", 0, 7);
Timer1.initialize(1000); // установка таймера на каждые 1000 микросекунд (= 1 мс)
Timer1.attachInterrupt(timerIsr); // запуск таймера
}
void timerIsr() { // прерывание таймера
enc1.tick();
}
void loop() {
if (clk == 0) { //Просто обновление данных на экране.
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
if (enc1.isDouble()) {clk = !clk;}
}
if (clk == 1) { //настройки setTemp и setTime.
if (enc1.isRight()) {
setTemp += 10;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isLeft()) {
setTemp -= 10;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isRightH()) {
setTime += 5;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isLeftH()) {
setTime -= 5;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isDouble()) {clk = !clk;}
}
}
int printing(int oldRealTemp, int setTemp, int oldSetTemp, int setTime, int oldSetTime){
int realTemp = round(thermocouple.readCelsius()*10)/10;
if (realTemp != oldRealTemp) {
myOLED.print( " ", 48, 3);
myOLED.print( realTemp, 48, 3);
}
if (setTemp != oldSetTemp) {
myOLED.print( " ", 48, 5);
myOLED.print( setTemp, 48, 5);
}
if (setTime != oldSetTime) {
myOLED.print( " ", 48, 7);
myOLED.print( setTime, 48, 7);
}
return realTemp;
}
При выводе данных в serial данные обновляются каждый цикл, но значения меняются только при задействовании энкодера. Отсюда делаю вывод, что по какой-то причине не перезаписывается переменная realTemp (лежит в функции printing). Уже третий день туплю, никак не могу понять, в чем проблема.
Собсна, код:
#include <TimerOne.h>
#include "max6675.h"
#include <iarduin
#include "GyverEncoder.h"
#define SW 10
#define DT 11
#define CLK 12
Encoder enc1(CLK, DT, SW);
iarduin
extern uint8_t MediumFontRus[];
extern uint8_t SmallFontRus[];
int thermoDO = 4;
int thermoCS = 3;
int thermoCLK = 2;
int setTemp = 200;
bool clk = 0;
int setTime = 0;
int oldSetTime = 999;
int oldRealTemp = 0;
int oldSetTemp = 0;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
void setup() {
enc1.setType(TYPE2);
pinMode(SW, INPUT_PULLUP);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
myOLED.begin();
myOLED.setFont(MediumFontRus);
myOLED.print("Разжигаем", OLED_C, 3);
myOLED.print("Духовку", OLED_C, 5);
//ждем стабилизации чипа MAX
delay(5000);
myOLED.clrScr();
myOLED.print( "C = ", 0, 3);
myOLED.print( "C = ", 0, 5);
myOLED.print( "T = ", 0, 7);
Timer1.initialize(1000); // установка таймера на каждые 1000 микросекунд (= 1 мс)
Timer1.attachInterrupt(timerIsr); // запуск таймера
}
void timerIsr() { // прерывание таймера
enc1.tick();
}
void loop() {
if (clk == 0) { //Просто обновление данных на экране.
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
if (enc1.isDouble()) {clk = !clk;}
}
if (clk == 1) { //настройки setTemp и setTime.
if (enc1.isRight()) {
setTemp += 10;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isLeft()) {
setTemp -= 10;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isRightH()) {
setTime += 5;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isLeftH()) {
setTime -= 5;
oldRealTemp = printing(oldRealTemp, setTemp, oldSetTemp, setTime, oldSetTime);
oldSetTime = setTime;
oldSetTemp = setTemp;
}
if (enc1.isDouble()) {clk = !clk;}
}
}
int printing(int oldRealTemp, int setTemp, int oldSetTemp, int setTime, int oldSetTime){
int realTemp = round(thermocouple.readCelsius()*10)/10;
if (realTemp != oldRealTemp) {
myOLED.print( " ", 48, 3);
myOLED.print( realTemp, 48, 3);
}
if (setTemp != oldSetTemp) {
myOLED.print( " ", 48, 5);
myOLED.print( setTemp, 48, 5);
}
if (setTime != oldSetTime) {
myOLED.print( " ", 48, 7);
myOLED.print( setTime, 48, 7);
}
return realTemp;
}
Вложения
-
3.1 KB Просмотры: 10
Изменено: