Commit 5812907a authored by Oleg Nikulin's avatar Oleg Nikulin

Переделана логика обмена (пк=мастер, коды команд); Rewrite скрипта и прошивки

parent fd983901
import serial
import time
def open_serial(port, baudrate):
try: #пытаемся открыть serial порт
serial_port = serial.Serial(
port = port,
baudrate = baudrate,
bytesize = 8,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE
)
except OSError:
return None
print('Delay before starting serial...')
time.sleep(2)
serial_port.reset_input_buffer()
serial_port.reset_output_buffer()
return serial_port
def serial_exchange(serial_port, transmit_bytes, required_response_length, timeout = 1):
if serial_port is None:
raise OSError
serial_port.reset_input_buffer()
serial_port.reset_output_buffer()
serial_port.write(bytearray(transmit_bytes))
if required_response_length == 0:
return bytes([])
#ждем ответ
steps = 10
for i in range(steps):
if serial_port.in_waiting >= required_response_length: break
time.sleep(timeout / steps)
if serial_port.in_waiting < required_response_length:
return None
response = serial_port.read(required_response_length)
return response
{
"device": "/dev/ttyUSB0",
"baudrate": 19200,
"pollIntervalSec": 2,
"arduinoTimeoutSec": 0.25,
"controlGroups":
[
{
"targetTemperature": 35,
"copyFromGroupIndex": 255
},
{
"targetTemperature": 40,
"copyFromGroupIndex": 255
},
{
"targetTemperature": 45,
"copyFromGroupIndex": 255
}
]
}
\ No newline at end of file
import subprocess
import time
import serial
import argparse
from argparse import RawTextHelpFormatter
import datetime
import threading
from threading import Event
import json
class pc_command_codes:
initialize = 1
poll = 2
class arduino_response_codes:
initialize_ok = 1
poll_noinit = 2
poll_ok = 3
fail = 255
POLL_SLEEP_TIME = 0.1 #Задержка между проверками наличия запроса от ардуины (cек)
RECONNECT_SLEEP_TIME = 1 #Задержка между попытками открыть serial порт при потере связи (cек)
TIMEOUT_TIME = 3 #Считается что ардуина перестала отвечать, если от нее не было запросов в течение этого времени (cек)
config = None
def load_json(filename):
try:
jsonFile = open(filename, mode='r', encoding='utf-8')
except:
print(f'Failed to open {filename}')
return None
try:
config = json.load(jsonFile)
except:
print(f'Failed to read json from {filename}')
return None
jsonFile.close()
return config
def cmdline_args_parse():
parser = argparse.ArgumentParser(
description = 'This script sends PC disk temperature via a serial port',
formatter_class=RawTextHelpFormatter
)
parser.add_argument('-m', '--manual',
required = False,
action='store_true',
help = 'send temperature from user input instead of hddtemp',
)
parser.add_argument('device',
type = str,
nargs = '?',
help = 'serial device to commuicate with. Example: /dev/ttyUSB0',
metavar = 'SERIAL'
)
parser.add_argument('speed',
type = int,
nargs = '?',
help = 'serial port baud rate',
metavar = 'SPEED'
)
args = parser.parse_args()
return args
\ No newline at end of file
#epmi pip
#pip install pyserial
import subprocess
import time
import serial
import argparse
from argparse import RawTextHelpFormatter
import datetime
import threading
POLL_SLEEP_TIME = 0.1 #Задержка между проверками наличия запроса от ардуины (cек)
RECONNECT_SLEEP_TIME = 1 #Задержка между попытками открыть serial порт при потере связи (cек)
TIMEOUT_TIME = 3 #Считается что ардуина перестала отвечать, если от нее не было запросов в течение этого времени (cек)
PORT:str = None
SPEED:int = None
temp = '50'
connected = False
from general import *
from communication import *
import termios
input_thread_running = False
initialized = False
temperatures = [30, 45, 50]
def temp_input():
global temp
def temp_input(stop_event):
global temperatures
while True:
temp_input = input('\033[60C' + 'Enter up to 3 temperature values (comma-separated): ')
temps = [0, 0, 0]
temp_input = input('\033[75G' + 'Enter up to 3 temperature values (CSV): ')
if stop_event.is_set():
input_thread_running = False
return
error = False
comma_pos = 0
find_start_index = 0
......@@ -38,7 +34,7 @@ def temp_input():
print("Can't be more than 3 values")
error = True
break
#выделяем число
if comma_pos == -1: #если запятой не найдено, то до конца строки
temp_substring = temp_input[find_start_index:]
......@@ -46,139 +42,178 @@ def temp_input():
temp_substring = temp_input[find_start_index:comma_pos]
try: #проверка, введено ли число
int(temp_substring)
temps[i] = int(temp_substring)
except ValueError:
print('Temperature value must be a number')
error = True
break
if comma_pos == -1: #если запятых больше нет, выходим из цикла
break
find_start_index = comma_pos + 1
if not error: #если всё хорошо, введенную строку можно отправлять
temp = temp_input
parser = argparse.ArgumentParser(
description = 'This script sends PC disk temperature via a serial port',
formatter_class=RawTextHelpFormatter
)
parser.add_argument('-m', '--manual',
required = False,
action='store_true',
help = 'send temperature from user input instead of hddtemp',
)
parser.add_argument('device',
type = str,
nargs = '?',
help = 'serial device to commuicate with. Example: /dev/ttyUSB0',
metavar = 'SERIAL'
)
parser.add_argument('speed',
type = int,
nargs = '?',
help = 'serial port baud rate',
metavar = 'SPEED'
)
args = parser.parse_args()
#проверка наличия аргументов
if args.device == None:
print('Serial device was not specified')
exit()
if args.speed == None:
print('Serial port baud rate was not specified')
exit()
if args.manual:
input_thread = threading.Thread(target = temp_input)
temp = '50,51,52'
PORT = args.device
SPEED = args.speed
try: #пытаемся открыть serial порт
serial_port = serial.Serial(
port = PORT,
baudrate = SPEED,
parity = serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
)
except OSError:
print('An error has occured while opening the serial port')
exit()
print('Connecting to the serial device...')
serial_port.reset_input_buffer()
while True:
if not error: #если всё хорошо, введенные значения можно отправлять
temperatures = temps
def initialize(serial_port):
global initialized
initialized = False
transmit_bytes = [
pc_command_codes.initialize,
config['pollIntervalSec'],
config['controlGroups'][0]['targetTemperature'],
config['controlGroups'][1]['targetTemperature'],
config['controlGroups'][2]['targetTemperature'],
config['controlGroups'][0]['copyFromGroupIndex'],
config['controlGroups'][1]['copyFromGroupIndex'],
config['controlGroups'][2]['copyFromGroupIndex']
]
response_length = 1
response = serial_exchange(serial_port, transmit_bytes, response_length, config['arduinoTimeoutSec'])
if response is None:
print('Initialize failed')
else:
if response[0] == arduino_response_codes.initialize_ok:
initialized = True
print('Initialize ok')
else:
print('Initialize not ok')
def poll(serial_port):
global initialized, temperatures
#температуры 16-битные со знаком (ну на всякий случай)
transmit_bytes = [
pc_command_codes.poll,
(temperatures[0] >> 8) & 0xff,
temperatures[0] & 0xff,
(temperatures[1] >> 8) & 0xff,
temperatures[1] & 0xff,
(temperatures[2] >> 8) & 0xff,
temperatures[2] & 0xff,
]
response_length = 16
response = serial_exchange(serial_port, transmit_bytes, response_length, config['arduinoTimeoutSec'])
if response is None:
initialized = False
print('Poll failed')
else:
if response[0] == arduino_response_codes.poll_noinit:
initialized = False
print('Arduino is not initialized. Probably it was reset')
elif response[0] == arduino_response_codes.poll_ok:
rpms = [0] * 6
pwms = [0] * 3
#rpm 16-битные без знака
for i in range(6):
rpms[i] = int.from_bytes(response[i*2+1 : i*2+3], byteorder='big', signed=False)
for i in range(3):
pwms[i] = response[i+13]
#print(f'RPM: {rpms} PWM: {pwms}')
#сохранение положения курсора, перевод на 74й символ, очистка всего перед курсором, курсор в начало строки, вывод оборотов, загрузка положения строки
print('\0337' +'\033[74G' + '\033[1K' + '\033[0G' + f'RPM: {rpms} PWM: {pwms}' + '\0338', end = '', flush=True)
return True
else:
initialized = False
print('Poll not ok')
return False
if __name__ == "__main__":
config = load_json('config.json')
if config is None:
exit()
args = cmdline_args_parse()
port = None
baudrate = None
if config['device'] is not None:
port = config['device']
if config['baudrate'] is not None:
baudrate = config['baudrate']
if args.device is not None:
port = args.device
if args.speed is not None:
baudrate = args.speed
if args.manual:
input_stop_event = Event()
input_thread = threading.Thread(target = temp_input, args=(input_stop_event,))
temp = '50,51,52'
if port is None:
print('Serial device is not specified (neither in config nor in command line)')
exit()
if baudrate is None:
print('Baudrate is not specified (neither in config nor in command line)')
exit()
serial_port = open_serial(port, baudrate)
if serial_port is None:
print('Failed to open serial port')
exit()
try:
if serial_port.in_waiting > 0:
if not connected:
if serial_port.readline().decode()[:-2] == 'start_transmission':
last_serial_input_time = datetime.datetime.now().timestamp()
serial_port.write('starting_transmission\n'.encode())
print('Connected. Starting transmission')
connected = True
if args.manual and not input_thread_running:
input_thread.start()
input_thread_running = True
incoming_line = serial_port.readline().decode()[:-2]
if 'req_temperature' in incoming_line:
last_serial_input_time = datetime.datetime.now().timestamp()
if args.manual:
serial_port.write(('temperature_' + temp + '\n').encode()) #отправка значения
while True:
regularPollInterval = False
try:
if not initialized:
initialize(serial_port)
else:
output = str(subprocess.Popen(['netcat', 'localhost', '7634'], stdout = subprocess.PIPE, stderr = subprocess.STDOUT).communicate()[0]) #получаем output от hddtemp
#b'|/dev/sda2|ST340014A|41|C|'
if output == "b''":
print('Hddtemp output is empty, make sure it is running. If not, launch it with #hddtemp -d')
exit()
#вычленяем значение температуры:
temp_pos_end = output.find('|C|')
temp_pos_start = output.rfind('|', 0, temp_pos_end) + 1
temp = output[temp_pos_start:temp_pos_end]
try:
int(temp)
#print(temp + ' C')
serial_port.write(('temperature_' + temp + '\n').encode()) #отправка значения
except ValueError:
print('Error: Failed to get a temperature value from hddtemp output')
if 'send_rpm' in incoming_line:
send_rpm_pos = incoming_line.find('send_rpm_')
rpm_string = incoming_line[send_rpm_pos + 9:]
rpm_string = rpm_string.replace('_', ' ')
rpm_string = 'Fan RPMs: ' + rpm_string
#сохранение положения курсора, перервод в начало строки, перевод на 59 символов вправо, очистка всего перед курсором, курсор в начало строки, вывод оборотов, загрузка положения строки
print('\0337' + '\033[255D' +'\033[59C' + '\033[1K' + '\033[255D' + rpm_string + '\0338', end = '', flush=True)
except OSError:
if connected:
print('\nSerial divice was disconnected. Trying to reconnect...')
connected = False
try: #пытаемся снова открыть serial порт
serial_port = serial.Serial(
port = '/dev/' + PORT,
baudrate = SPEED
)
connected = True
except OSError: print('...')
time.sleep(RECONNECT_SLEEP_TIME)
if connected and datetime.datetime.now().timestamp() - last_serial_input_time > TIMEOUT_TIME:
print('\nSerial device is not responding')
connected = False
time.sleep(POLL_SLEEP_TIME)
\ No newline at end of file
if not args.manual:
output = str(subprocess.Popen(['netcat', 'localhost', '7634'], stdout = subprocess.PIPE, stderr = subprocess.STDOUT).communicate()[0]) #получаем output от hddtemp
#b'|/dev/sda2|ST340014A|41|C|'
if output == "b''":
print('Hddtemp output is empty, make sure it is running. If not, launch it with #hddtemp -d')
exit()
#вычленяем значение температуры:
temp_pos_end = output.find('|C|')
temp_pos_start = output.rfind('|', 0, temp_pos_end) + 1
temp = output[temp_pos_start:temp_pos_end]
try:
temperatures[0] = int(temp)
except ValueError:
print('Error: Failed to get a temperature value from hddtemp output')
if (poll(serial_port)):
if args.manual and not input_thread_running:
input_stop_event.clear()
input_thread.start()
input_thread_running = True
regularPollInterval = True
except (OSError, termios.error):
input_stop_event.set()
print()
print('Serial port error. Trying to open serial port again...')
serial_port = open_serial(port, baudrate)
if serial_port is not None:
print('Success')
#обычнаый интервал используется при обычном обмене когда всё ок
if (regularPollInterval):
time.sleep(config['pollIntervalSec'])
else:
time.sleep(0.5)
except KeyboardInterrupt:
exit()
#include <Wire.h>
//#include <Wire.h>
#define FAN_COUNT 6 //Количество вентиляторов
#define CONTROL_COUNT 3 //Количество групп управления
#define BAUDRATE 19200 //Скорость serial порта
#define CHECK_TEMP_DELAY 200 //Интервал получения температуры от пк (мс)
#define GET_TEMP_TIMEOUT 1000 //Если в течение этого времени температура не была прислана, считается что пк не отвечает (мс)
#define RPM_CHECK_INTERVAL 200 //Интервал подсчета rpm и обнуления tachRevs (мс)
#define RPM_VALUES_COUNT 5 //Количество значений RPM, которые записываются и усредняются (скользящее среднее)
#define MIN_PWM_DUTY_CYCLE 2 //Минимальная скважность ШИМ
#define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ
#define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк)
#define DEFAULT_PWM_DUTY_CYCLE MAX_PWM_DUTY_CYCLE //Скважность ШИМ по умолчанию (до подключения к пк)
#define BEEP_INTERVAL 1000 //Интервал пищания во время потери связи или перегрева (мс)
#define BEEP_STRENGTH 100 //Уровень ШИМ для пищалки. (При 255 не работает, нужно чтобы был именно ШИМ)
......@@ -29,6 +27,8 @@ struct control {//Данные о группе управления
uint8_t pin; //Номер пина
volatile uint8_t mode; //Текущий режим работы. 0 - всегда выкл, 1 - шим, 2 - всегда вкл
uint8_t &dutyCycle; //Скважность ШИМ
int16_t temperature; //Текущая температура
int16_t target_temperature; //Температура, к которой нужно стремиться
int8_t copy_from; //Копировать скважность с другой группы управления. -1 = не копировать, 0 = с группы A, 1 = с группы B, 2 = с группы C
};
......@@ -37,18 +37,24 @@ control controls[CONTROL_COUNT] = {
3,
1,
*control_a_addr,
0,
0,
-1
},
{
5,
1,
*control_b_addr,
0,
0,
0
},
{
6,
1,
*control_c_addr,
0,
0,
0
}
};
......@@ -120,10 +126,8 @@ fan &fan_5 = fans[4];
fan &fan_6 = fans[5];
int temps[3] = {}; //Температуры, полученные от пк
uint32_t last_beep_time = 0;
uint32_t last_check_time = 0;
uint32_t last_poll_time = 0;
uint32_t lastRpmCheck = 0;
float p[3] = {};
......@@ -136,120 +140,124 @@ float k_d = 0;
float i_max = 210;
int target_temps[3] = {27, 0, 0}; //Температуры, к которым нужно стремиться
void wait_for_connection(bool beep) { //функция, которая мигает светодиодом и пищит (если beep == true) до тех пор, пока не будет установлено соединение с ПК
Serial.println("start_transmission");
digitalWrite(LED_PIN, 1);
unsigned long last_blink_time = millis();
while (Serial.available() == 0) {//ждем ответа
if (millis() >= last_blink_time + BLINK_INTERVAL * 2) {
digitalWrite(LED_PIN, 1);
last_blink_time = millis();
}
else if (millis() >= last_blink_time + BLINK_INTERVAL) {
digitalWrite(LED_PIN, 0);
}
if (beep) {
if (millis() >= last_beep_time + BEEP_INTERVAL * 2) {
analogWrite(SOUND_PIN, BEEP_STRENGTH);
last_beep_time = millis();
}
else if (millis() >= last_beep_time + BEEP_INTERVAL) {
analogWrite(SOUND_PIN, 0);
}
}
}
digitalWrite(LED_PIN, 0); //гасим светодиод
analogWrite(SOUND_PIN, 0); //и выключаем пищалку
while (Serial.available()) {// очистка буфера
Serial.readString();
}
}
enum pc_command_codes {
initialize = 1,
poll = 2
};
enum arduino_response_codes {
initialize_ok = 1,
poll_noinit = 2,
poll_ok = 3,
fail = 255
};
int16_t pc_poll_interval_sec = -1;
bool pc_respond = true;
bool initialized = false;
void tempFromPc()// получаем температуру от пк
{
String rpm_string = "send_rpm_";
for (int fan = 0; fan < FAN_COUNT; fan++) {
uint32_t avg_rpm = 0;
for (int val = 0; val < RPM_VALUES_COUNT; val++) {
avg_rpm += fans[fan].rpm[val];
}
avg_rpm /= RPM_VALUES_COUNT;
rpm_string += String(avg_rpm);
if (fan < 5) {
rpm_string += "_";
}
}
Serial.println("req_temperature_" + rpm_string + "_debug_" + String(OCR1A) + "_" + String(OCR2A) + "_" + String(OCR2B)); //запрос к пк
unsigned long query_time = millis();
while (Serial.available() == 0) { //ждем пока ответит
if (millis() >= query_time + GET_TEMP_TIMEOUT) { //если слишком долго не отвечает
//Венитялторы на максимум
for (int i = 0; i < CONTROL_COUNT; i++) {
controls[i].dutyCycle = DEFAULT_PWM_DUTY_CYCLE; //установка скважности по умолчанию
}
wait_for_connection(true);//снова ждем подключения
break;
}
uint16_t get_avg_rpm(fan* fan_ptr) {
uint32_t avg_rpm = 0;
for (int val = 0; val < RPM_VALUES_COUNT; val++) {
avg_rpm += fan_ptr->rpm[val];
}
String response = Serial.readStringUntil('\n'); //выделяем строку до \n
int temperature_index = response.indexOf("temperature_");
avg_rpm /= RPM_VALUES_COUNT;
return avg_rpm;
}
if (temperature_index != -1) { //если в строке есть temperature_
String temperatures = response.substring(temperature_index + 12); //отбрасываем temperature_
int comma_pos = 0;
int find_start_index = 0;
void process_command() {
uint8_t cmd_code = 0;
uint8_t cmd_buffer[32] = {};
uint8_t cmd_length = 0;
uint8_t response_buffer[32] = {};
response_buffer[0] = arduino_response_codes::fail;
uint8_t response_length = 1;
for (int i = 0; i < 3; i++) { //парсим строку с температурами
String temp_substring = "";
comma_pos = temperatures.indexOf(",", find_start_index);
//читаем первый байт (код команды)
if (Serial.readBytes(&cmd_code, 1) == 0)
return;
if (comma_pos == -1) { //если запятой не найдено, то до конца строки
temp_substring = temperatures.substring(find_start_index);
}
else {
temp_substring = temperatures.substring(find_start_index, comma_pos);
}
//по коду команды понимаем сколько еще байтов надо принять
switch(cmd_code) {
case pc_command_codes::initialize:
cmd_length = 7;
break;
case pc_command_codes::poll:
cmd_length = 6;
break;
default:
break;
}
//проверка, является ли temp_substring числом:
if (temp_substring.length() == 0) {
break;
}
bool isInt = 1;
for (int i = 0; i < temp_substring.length(); i++) {
if (isDigit(temp_substring.charAt(i)) == false && (temp_substring.charAt(i) != '-' || (temp_substring.charAt(i) == '-' && i > 0))) {
isInt = 0;
//читаем команду
if (cmd_length > 0) {
uint8_t bytes_read = Serial.readBytes(cmd_buffer, cmd_length);
//выполняем команду
if (bytes_read == cmd_length) {
switch(cmd_code) {
case pc_command_codes::initialize:
pc_poll_interval_sec = cmd_buffer[0];
control_a.target_temperature = cmd_buffer[1];
control_b.target_temperature = cmd_buffer[2];
control_c.target_temperature = cmd_buffer[3];
control_a.copy_from = cmd_buffer[4];
control_b.copy_from = cmd_buffer[5];
control_c.copy_from = cmd_buffer[6];
initialized = true;
response_buffer[0] = arduino_response_codes::initialize_ok;
response_length = 1;
break;
case pc_command_codes::poll:
control_a.temperature = cmd_buffer[0] << 8 | cmd_buffer[1];
control_b.temperature = cmd_buffer[2] << 8 | cmd_buffer[3];
control_c.temperature = cmd_buffer[4] << 8 | cmd_buffer[5];
if (initialized)
response_buffer[0] = arduino_response_codes::poll_ok;
else
response_buffer[0] = arduino_response_codes::poll_noinit;
for (int i = 0; i < FAN_COUNT; i++){
uint16_t rpm = get_avg_rpm(&fans[i]);
response_buffer[i*2+1] = rpm >> 8;
response_buffer[i*2+2] = rpm & 0xff;
}
response_buffer[13] = OCR1A;
response_buffer[14] = OCR2A;
response_buffer[15] = OCR2B;
response_length = 16;
break;
default:
break;
}
}
if (!isInt) {
break;
}
temps[i] = temp_substring.toInt();
if (comma_pos == -1) { //если запятых больше нет, выходим из цикла
break;
}
find_start_index = comma_pos + 1;
}
last_poll_time = millis();
pc_respond = true;
}
}
while (Serial.available()) // очистка буфера
Serial.read();
//ответ
Serial.write(response_buffer, response_length);
}
......@@ -265,18 +273,22 @@ void rpm_control() {
for (int group = 0; group < 3; group++) {//управление скоростью 3-х групп вентиляторов
if (controls[group].copy_from == -1) {
if (controls[group].copy_from < 0 || controls[group].copy_from > 2) {
uint8_t duty_cycle = 0;
float pwmDutyCycle = MAX_PWM_DUTY_CYCLE;
if (pc_respond){
d[group] = (controls[group].temperature - controls[group].target_temperature - p[group]) / float(millis() - lastRpmCheck);
p[group] = controls[group].temperature - controls[group].target_temperature;
i[group] = i[group] + p[group] * (millis() - lastRpmCheck);
if (fabs(i[group] * k_i) >= i_max) {
i[group] = i_max / k_i;
}
d[group] = (temps[group] - target_temps[group] - p[group]) / float(millis() - lastRpmCheck);
p[group] = temps[group] - target_temps[group];
i[group] = i[group] + p[group] * (millis() - lastRpmCheck);
if (fabs(i[group] * k_i) >= i_max) {
i[group] = i_max / k_i;
pwmDutyCycle = round(p[group] * k_p + i[group] * k_i + d[group] * k_d);
}
float pwmDutyCycle = round(p[group] * k_p + i[group] * k_i + d[group] * k_d);
if (pwmDutyCycle < 0) {
duty_cycle = 0;
......@@ -419,8 +431,6 @@ void setup() {
}
Serial.begin(BAUDRATE);
wait_for_connection(false); //Ждем установленя связи с ПК
}
......@@ -428,26 +438,34 @@ void setup() {
void loop() {
if (uint32_t(millis() - last_check_time) >= CHECK_TEMP_DELAY) {
last_check_time = millis();
tempFromPc();//получаем температуру от пк
if (temps[0] >= OVERHEAT_TEMP || temps[1] >= OVERHEAT_TEMP || temps[2] >= OVERHEAT_TEMP ) { //Если перегрев, включается пищалка
if (millis() >= last_beep_time + BEEP_INTERVAL * 2) {
analogWrite(SOUND_PIN, BEEP_STRENGTH);
last_beep_time = millis();
}
else if (millis() >= last_beep_time + BEEP_INTERVAL) {
analogWrite(SOUND_PIN, 0);
}
if (Serial.available() > 0)
{
process_command();
}
if (initialized)
{
if (uint32_t(millis() - lastRpmCheck) >= RPM_CHECK_INTERVAL) {
rpm_control();
}
else {
analogWrite(SOUND_PIN, 0); //Чтобы постоянно не пищал, если температура станет < 80 в то время, как пищалка включена
}
if (pc_poll_interval_sec != -1 && uint32_t(millis() - last_poll_time) >= pc_poll_interval_sec * 2 * 1000) {
pc_respond = false;
}
if (control_a.temperature >= OVERHEAT_TEMP || control_b.temperature >= OVERHEAT_TEMP || control_c.temperature >= OVERHEAT_TEMP ) { //Если перегрев, включается пищалка
if (millis() >= last_beep_time + BEEP_INTERVAL * 2) {
analogWrite(SOUND_PIN, BEEP_STRENGTH);
last_beep_time = millis();
}
else if (millis() >= last_beep_time + BEEP_INTERVAL) {
analogWrite(SOUND_PIN, 0);
}
}
if (uint32_t(millis() - lastRpmCheck) >= RPM_CHECK_INTERVAL) {
rpm_control();
else {
analogWrite(SOUND_PIN, 0); //Чтобы постоянно не пищал, если температура станет нормальной в то время, как пищалка включена
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment