print('Serial device is not specified (neither in config nor in command line)')
exit()
ifbaudrateisNone:
print('Baudrate is not specified (neither in config nor in command line)')
exit()
serial_port=open_serial(port,baudrate)
ifserial_portisNone:
print('Failed to open serial port')
exit()
try:
whileTrue:
regularPollInterval=False
try:
ifnotinitialized:
initialize(serial_port)
else:
else:
ifnotargs.manual:
output=str(subprocess.Popen(['netcat','localhost','7634'],stdout=subprocess.PIPE,stderr=subprocess.STDOUT).communicate()[0])#получаем output от hddtemp
output=str(subprocess.Popen(['netcat','localhost','7634'],stdout=subprocess.PIPE,stderr=subprocess.STDOUT).communicate()[0])#получаем output от hddtemp
#b'|/dev/sda2|ST340014A|41|C|'
#b'|/dev/sda2|ST340014A|41|C|'
ifoutput=="b''":
ifoutput=="b''":
...
@@ -148,37 +190,30 @@ while True:
...
@@ -148,37 +190,30 @@ while True:
temp_pos_start=output.rfind('|',0,temp_pos_end)+1
temp_pos_start=output.rfind('|',0,temp_pos_end)+1
temp=output[temp_pos_start:temp_pos_end]
temp=output[temp_pos_start:temp_pos_end]
try:
try:
int(temp)
temperatures[0]=int(temp)
#print(temp + ' C')
serial_port.write(('temperature_'+temp+'\n').encode())#отправка значения
exceptValueError:
exceptValueError:
print('Error: Failed to get a temperature value from hddtemp output')
print('Error: Failed to get a temperature value from hddtemp output')
if'send_rpm'inincoming_line:
if(poll(serial_port)):
send_rpm_pos=incoming_line.find('send_rpm_')
ifargs.manualandnotinput_thread_running:
rpm_string=incoming_line[send_rpm_pos+9:]
input_stop_event.clear()
rpm_string=rpm_string.replace('_',' ')
input_thread.start()
rpm_string='Fan RPMs: '+rpm_string
input_thread_running=True
#сохранение положения курсора, перервод в начало строки, перевод на 59 символов вправо, очистка всего перед курсором, курсор в начало строки, вывод оборотов, загрузка положения строки
#define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк)
#define DEFAULT_PWM_DUTY_CYCLE MAX_PWM_DUTY_CYCLE //Скважность ШИМ по умолчанию (до подключения к пк)
#define BEEP_INTERVAL 1000 //Интервал пищания во время потери связи или перегрева (мс)
#define BEEP_INTERVAL 1000 //Интервал пищания во время потери связи или перегрева (мс)
#define BEEP_STRENGTH 100 //Уровень ШИМ для пищалки. (При 255 не работает, нужно чтобы был именно ШИМ)
#define BEEP_STRENGTH 100 //Уровень ШИМ для пищалки. (При 255 не работает, нужно чтобы был именно ШИМ)
...
@@ -29,6 +27,8 @@ struct control {//Данные о группе управления
...
@@ -29,6 +27,8 @@ struct control {//Данные о группе управления
uint8_tpin;//Номер пина
uint8_tpin;//Номер пина
volatileuint8_tmode;//Текущий режим работы. 0 - всегда выкл, 1 - шим, 2 - всегда вкл
volatileuint8_tmode;//Текущий режим работы. 0 - всегда выкл, 1 - шим, 2 - всегда вкл
uint8_t&dutyCycle;//Скважность ШИМ
uint8_t&dutyCycle;//Скважность ШИМ
int16_ttemperature;//Текущая температура
int16_ttarget_temperature;//Температура, к которой нужно стремиться
int8_tcopy_from;//Копировать скважность с другой группы управления. -1 = не копировать, 0 = с группы A, 1 = с группы B, 2 = с группы C
int8_tcopy_from;//Копировать скважность с другой группы управления. -1 = не копировать, 0 = с группы A, 1 = с группы B, 2 = с группы C
};
};
...
@@ -37,18 +37,24 @@ control controls[CONTROL_COUNT] = {
...
@@ -37,18 +37,24 @@ control controls[CONTROL_COUNT] = {
3,
3,
1,
1,
*control_a_addr,
*control_a_addr,
0,
0,
-1
-1
},
},
{
{
5,
5,
1,
1,
*control_b_addr,
*control_b_addr,
0,
0,
0
0
},
},
{
{
6,
6,
1,
1,
*control_c_addr,
*control_c_addr,
0,
0,
0
0
}
}
};
};
...
@@ -120,10 +126,8 @@ fan &fan_5 = fans[4];
...
@@ -120,10 +126,8 @@ fan &fan_5 = fans[4];
fan&fan_6=fans[5];
fan&fan_6=fans[5];
inttemps[3]={};//Температуры, полученные от пк
uint32_tlast_beep_time=0;
uint32_tlast_beep_time=0;
uint32_tlast_check_time=0;
uint32_tlast_poll_time=0;
uint32_tlastRpmCheck=0;
uint32_tlastRpmCheck=0;
floatp[3]={};
floatp[3]={};
...
@@ -136,120 +140,124 @@ float k_d = 0;
...
@@ -136,120 +140,124 @@ float k_d = 0;
floati_max=210;
floati_max=210;
inttarget_temps[3]={27,0,0};//Температуры, к которым нужно стремиться
enumpc_command_codes{
initialize=1,
poll=2
};
voidwait_for_connection(boolbeep){//функция, которая мигает светодиодом и пищит (если beep == true) до тех пор, пока не будет установлено соединение с ПК
enumarduino_response_codes{
Serial.println("start_transmission");
initialize_ok=1,
digitalWrite(LED_PIN,1);
poll_noinit=2,
unsignedlonglast_blink_time=millis();
poll_ok=3,
while(Serial.available()==0){//ждем ответа
fail=255
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();
}
}
int16_tpc_poll_interval_sec=-1;
boolpc_respond=true;
boolinitialized=false;
voidtempFromPc()// получаем температуру от пк
{
uint16_tget_avg_rpm(fan*fan_ptr){
Stringrpm_string="send_rpm_";
for(intfan=0;fan<FAN_COUNT;fan++){
uint32_tavg_rpm=0;
uint32_tavg_rpm=0;
for(intval=0;val<RPM_VALUES_COUNT;val++){
for(intval=0;val<RPM_VALUES_COUNT;val++){
avg_rpm+=fans[fan].rpm[val];
avg_rpm+=fan_ptr->rpm[val];
}
}
avg_rpm/=RPM_VALUES_COUNT;
avg_rpm/=RPM_VALUES_COUNT;
returnavg_rpm;
}
rpm_string+=String(avg_rpm);
if(fan<5){
rpm_string+="_";
}
}
Serial.println("req_temperature_"+rpm_string+"_debug_"+String(OCR1A)+"_"+String(OCR2A)+"_"+String(OCR2B));//запрос к пк
voidprocess_command(){
unsignedlongquery_time=millis();
uint8_tcmd_code=0;
while(Serial.available()==0){//ждем пока ответит
uint8_tcmd_buffer[32]={};
if(millis()>=query_time+GET_TEMP_TIMEOUT){//если слишком долго не отвечает
uint8_tcmd_length=0;
//Венитялторы на максимум
for(inti=0;i<CONTROL_COUNT;i++){
uint8_tresponse_buffer[32]={};
controls[i].dutyCycle=DEFAULT_PWM_DUTY_CYCLE;//установка скважности по умолчанию