serial_port.write(('temperature_'+temp+'\n').encode())#отправка значения
whileTrue:
regularPollInterval=False
try:
ifnotinitialized:
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|'
ifoutput=="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())#отправка значения
exceptValueError:
print('Error: Failed to get a temperature value from hddtemp output')
if'send_rpm'inincoming_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 символов вправо, очистка всего перед курсором, курсор в начало строки, вывод оборотов, загрузка положения строки
output=str(subprocess.Popen(['netcat','localhost','7634'],stdout=subprocess.PIPE,stderr=subprocess.STDOUT).communicate()[0])#получаем output от hddtemp
#b'|/dev/sda2|ST340014A|41|C|'
ifoutput=="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)
exceptValueError:
print('Error: Failed to get a temperature value from hddtemp output')
if(poll(serial_port)):
ifargs.manualandnotinput_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)
ifserial_portisnotNone:
print('Success')
#обычнаый интервал используется при обычном обмене когда всё ок
#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_tpin;//Номер пина
volatileuint8_tmode;//Текущий режим работы. 0 - всегда выкл, 1 - шим, 2 - всегда вкл
uint8_t&dutyCycle;//Скважность ШИМ
int16_ttemperature;//Текущая температура
int16_ttarget_temperature;//Температура, к которой нужно стремиться
int8_tcopy_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];
inttemps[3]={};//Температуры, полученные от пк
uint32_tlast_beep_time=0;
uint32_tlast_check_time=0;
uint32_tlast_poll_time=0;
uint32_tlastRpmCheck=0;
floatp[3]={};
...
...
@@ -136,120 +140,124 @@ float k_d = 0;
floati_max=210;
inttarget_temps[3]={27,0,0};//Температуры, к которым нужно стремиться
voidwait_for_connection(boolbeep){//функция, которая мигает светодиодом и пищит (если beep == true) до тех пор, пока не будет установлено соединение с ПК
Serial.println("start_transmission");
digitalWrite(LED_PIN,1);
unsignedlonglast_blink_time=millis();
while(Serial.available()==0){//ждем ответа
if(millis()>=last_blink_time+BLINK_INTERVAL*2){
digitalWrite(LED_PIN,1);
last_blink_time=millis();
}
elseif(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();
}
elseif(millis()>=last_beep_time+BEEP_INTERVAL){
analogWrite(SOUND_PIN,0);
}
}
}
digitalWrite(LED_PIN,0);//гасим светодиод
analogWrite(SOUND_PIN,0);//и выключаем пищалку
while(Serial.available()){// очистка буфера
Serial.readString();
}
}
enumpc_command_codes{
initialize=1,
poll=2
};
enumarduino_response_codes{
initialize_ok=1,
poll_noinit=2,
poll_ok=3,
fail=255
};
int16_tpc_poll_interval_sec=-1;
boolpc_respond=true;
boolinitialized=false;
voidtempFromPc()// получаем температуру от пк
{
Stringrpm_string="send_rpm_";
for(intfan=0;fan<FAN_COUNT;fan++){
uint32_tavg_rpm=0;
for(intval=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));//запрос к пк
unsignedlongquery_time=millis();
while(Serial.available()==0){//ждем пока ответит
if(millis()>=query_time+GET_TEMP_TIMEOUT){//если слишком долго не отвечает
//Венитялторы на максимум
for(inti=0;i<CONTROL_COUNT;i++){
controls[i].dutyCycle=DEFAULT_PWM_DUTY_CYCLE;//установка скважности по умолчанию