Rubistar, мне конечно не жалко. Но написано все в той же среде arduino. Под ядро miniCore. Атмегу надо запаять на макетку и прошить загрузчик. Пока не пришла силиконовая трубка не написан спайщик. Если по коду вы разберетесь что куда в схеме подключать то вот оно. Программист из меня такой же как балерина. Но работает..

Спойлер
#include "GyverTM1637.h"
#include <ErriezTM1637.h>
#include "GyverPID.h"
#define B 3950 // B-коэффициент
#define SERIAL_R 4700 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)
#define CLK 2
#define DIO 3
#define TM1637_CLK_PIN 2
#define TM1637_DIO_PIN 3
// пины для подключения контактов STEP, DIR
#define STEP_PIN 12
#define DIR_PIN 11
#define STEP_ROUND 200000
// задержка между шагами двигателя
#define StopPin 10
const byte tempPin = A0;
const byte PidPin = 3;
//const byte StopPin = 10;
TM1637 tm1637(TM1637_CLK_PIN, TM1637_DIO_PIN);
GyverTM1637 disp(CLK, DIO);
GyverPID regulator(10, 0.05, 1, 50); // коэф. П, коэф. И, коэф. Д, период дискретизации dt (мс)
int tempst = 255;
boolean running = false;
boolean stepp = false;
void(* resetFunc) (void) = 0;
int keys;
static uint8_t keysLast = 0;
int DELAY_STEPS=3;
int DELAY_STEPS1=10;
unsigned long time;
unsigned long currentTime;
void setup() {
// Serial.begin(9600);
currentTime = millis();
time = currentTime;;
pinMode( tempPin, INPUT );
pinMode(StopPin, INPUT_PULLUP);
pinMode( PidPin, OUTPUT);
disp.clear();
disp.brightness(7);
disp.displayByte(_H, _E, _L, _O);
regulator.setDirection(NORMAL); // направление регулирования (NORMAL/REVERSE). ПО УМОЛЧАНИЮ СТОИТ NORMAL
regulator.setLimits(0, 255); // пределы (ставим для 8 битного ШИМ). ПО УМОЛЧАНИЮ СТОЯТ 0 И 255
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
// начальные значения
digitalWrite(STEP_PIN, 1);
digitalWrite(DIR_PIN, 0);
}
void loop() {
int sensorVal = digitalRead(StopPin);
if (sensorVal==LOW){STOP();}
// Serial.println (sensorVal);
if (running == true) { //таймер запущен
gettemp();
if (stepp == true) {
keys = tm1637.getKeys();
// Serial.println (keys);
switch (keys)
{
case 0x8:
DELAY_STEPS1= DELAY_STEPS1+5;
if (DELAY_STEPS1>15){DELAY_STEPS1=5;}
delay(100);
break;
}
digitalWrite(DIR_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delay(DELAY_STEPS1);
digitalWrite(STEP_PIN, LOW);
delay(DELAY_STEPS1);
}
}
while (running == false) {
keys = tm1637.getKeys();
// Serial.println (keys);
switch (keys)
{
case 0x8:
set_temp();
break;
case 0x6: // возврат
disp.clear();
running = true;
break;
case 0x4:
digitalWrite(DIR_PIN, HIGH);
// сделать 1 оборот
for(int i = 0; i < STEP_ROUND; i++) {
digitalWrite(STEP_PIN, HIGH);
delay(DELAY_STEPS);
digitalWrite(STEP_PIN, LOW);
delay(DELAY_STEPS);
keys = tm1637.getKeys();
switch (keys) {
case 0x3:
STOP();
break;
// case 0x7:
//stepp =false;
// break;
}
}
}
}
}
void set_temp() {
disp.clear();
while (running == false) {
// disp.displayInt(tempst);
int btn1 = tm1637.getKeys(); //опрашиваем кнопки
switch (btn1)
{
case 0x8: tempst += 5; // крайняя левая добавить температуру
if (tempst > 240) tempst = 180;
delay(300);
disp.clear();
disp.point(0);
disp.displayInt(tempst);
break;
case 0xA: // возврат
disp.clear();
running = true;
break;
}
}
}
void gettemp() {
int t = 0;
// unsigned long bb = 0;
// for (int i = 0; i < 5; i++) {
t = analogRead( tempPin );
// bb = bb + t ;
// }
// t = bb / 5;
float tr = 1023.0 / t - 1;
tr = SERIAL_R / tr;
float steinhart;
steinhart = tr / THERMISTOR_R; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= B; // 1/B * ln(R/Ro)
steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15;
if (millis() - currentTime > 1000) // проверяем сколько прошло миллисекунд
{
currentTime = millis();
disp.displayInt(round(steinhart));
}
regulator.setpoint = tempst;
regulator.input = steinhart;
analogWrite(PidPin, regulator.getResultTimer());
if (running == true)
{
keys = tm1637.getKeys();
switch (keys) {
case 0x3:
STOP();
break;
case 0x7:
stepp =true;
break;
}
}
//Serial.print (round(floor(steinhart)));
//Serial.println (" Temp");
}
void STOP() {
running = false;
disp.clear();
disp.point(0);
disp.displayByte(_S, _t, _O, _P);
digitalWrite(PidPin, LOW);
// digitalWrite(PEZO, HIGH );
resetFunc(); //сбрасываем для ввода нового значения таймера}
}