#define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк)
...
...
@@ -19,7 +19,7 @@
#define SOUND_PIN 10 //Номер пина пищалки
#define LED_PIN 13 //Номер пина светодиода
#define OVERHEAT_TEMP 80 //Температура, при достижении которой включается пищалка
#define OVERHEAT_TEMP 75 //Температура, при достижении которой включается пищалка
uint8_t*control_a_addr=0x88;//адрес сравнения А таймера 1
uint8_t*control_b_addr=0xB3;//адрес сравнения А таймера 2
...
...
@@ -29,7 +29,7 @@ struct control {//Данные о группе управления
uint8_tpin;//Номер пина
volatileuint8_tmode;//Текущий режим работы. 0 - всегда выкл, 1 - шим, 2 - всегда вкл
uint8_t&dutyCycle;//Скважность ШИМ
int8_tcopy_from;//Копировать скважность из другой группы управления. -1 = не копировать
int8_tcopy_from;//Копировать скважность с другой группы управления. -1 = не копировать, 0 = с группы A, 1 = с группы B, 2 = с группы C
};
controlcontrols[CONTROL_COUNT]={
...
...
@@ -136,7 +136,7 @@ float k_d = 0;
floati_max=210;
inttarget_temps[3]={27,0,0};
inttarget_temps[3]={27,0,0};//Температуры, к которым нужно стремиться
voidwait_for_connection(boolbeep){//функция, которая мигает светодиодом и пищит (если beep == true) до тех пор, пока не будет установлено соединение с ПК
Serial.println("start_transmission");
...
...
@@ -189,7 +189,7 @@ void tempFromPc()// получаем температуру от пк
}
}
Serial.println("req_temperature_"+rpm_string+"_debug(pwm values):_"+String(OCR1A)+"_"+String(OCR2A)+"_"+String(OCR2B));//запрос к пк
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){//если слишком долго не отвечает
volatileuint16_trevs;//Количество оборотов (просто, не в минуту)
uint16_trpm[RPM_VALUES_COUNT];//Обороты в минуту
};
fanfans[FAN_COUNT]={
{
14,
1,
0,
0,
0
},
{
15,
1,
0,
0,
0
},
{
16,
1,
0,
0,
0
},
{
17,
1,
0,
0,
0
},
{
18,
1,
0,
0,
0
},
{
19,
1,
0,
0,
0
}
};
fan&fan_1=fans[0];
fan&fan_2=fans[1];
fan&fan_3=fans[2];
fan&fan_4=fans[3];
fan&fan_5=fans[4];
fan&fan_6=fans[5];
inttemps[3]={};//Температуры, полученные от пк
uint32_tlast_beep_time=0;
uint32_tlast_check_time=0;
uint32_tlastRpmCheck=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();
}
}
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(OCR1B)+"_"+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;//установка скважности по умолчанию