PHP код:
#include <IRremote.h>
#include <DallasTemperature.h>
DallasTemperature tempInput, tempOutput, tempDriver, tempPassenger ;
byte bytes[13]; // 0-3 байт энкодер, рулевые кнопки, ИК приемник, веб камера
// 4 байт датчик света
// 5 байт датчик напряжения
// 6 байт датчик топлива
// 7-12 зарезервированы
int LIGHT_SENS = 0 ; // Вход датчика освещености аналог вход
int VOLT_SENS = 1 ; // Вход датчика напряжения Аналог вход
int FUEL_SENS = 2 ; // Вход датчика уровня топлива аналог вход
int MOTOR = 3 ; // Вход контроля запуска двигателя аналог
int RECV_PIN = 4 ; //вход ИК приемника аналог
int JOYSTIK_PIN = 5 ; // Вход для рулевых Кнопок аналог вход
int AVTO_LIGHT_ON = 6 ;// Вход кнопки переключения света в автоматический режим аналог
int TEMP_INPUT = 22 ; //Вход датчика температуры салона
int TEMP_OUTPUT = 24 ; // Вход датчика температуры забортом.
int TEMP_DRIVER = 26 ; // Вход датчика сиденья водителя
int TEMP_PASSENGER = 28 ; // Вход датчика сиденья пассажира
int HEAT_DRIVER = 6 ; // Выход шим нагрев водительского сиденья
int HEAT_PASSENGER = 12 ; // Выход шим нагрев пассажирского сиденья
int AVTO_LIGHT = 3 ; // Выход шим Свет в авто режиме.
// int back_cam = 6; //Вход активации камера заднего вида
// int encoder0PinA = 2 ; //Вывод А энкодера
// int encoder0PinB = 3 ; //Вывод В энкодера
// int encoder_botton = 4; //Вход кнопки энкодера
unsigned long res_dt, ir_dt, old_ir, time;
byte temp, cam_status;
IRrecv irrecv(RECV_PIN);
decode_results results;
//******************************************
void setup()
{
pinMode (TEMP_INPUT, INPUT); // Устанавливаем порт на вход дачика t салона
tempInput.begin(TEMP_INPUT);
pinMode (TEMP_OUTPUT, INPUT); // Устанавливаем порт на вход датчика t забортом
tempOutput.begin(TEMP_OUTPUT);
pinMode (TEMP_DRIVER, INPUT); // Устанавливаем порт на вход датчика t водительского сиденья
tempDriver.begin(TEMP_DRIVER);
pinMode (TEMP_PASSENGER, INPUT); // Устанавливаем порт на вход датчика t пассажирского сиденья
tempPassenger.begin(TEMP_PASSENGER);
pinMode (HEAT_DRIVER, OUTPUT); // Устанавливаем ШИМ-порт на выход подогрева водительского сиденья
pinMode (HEAT_PASSENGER, OUTPUT); // Устанавливаем ШИМ-порт на выход подогрева пассажирского сиденья
pinMode (AVTO_LIGHT, OUTPUT); // Устанавливаем ШИМ-порт на выход автоматического света
// pinMode(encoder0PinA, INPUT);
// digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
// pinMode(encoder0PinB, INPUT);
// digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
// pinMode(encoder_botton, INPUT);
// digitalWrite(encoder_botton, HIGH); // подключить подтягивающий резистор
// pinMode(back_cam, INPUT);
// digitalWrite(back_cam, HIGH); // подключить подтягивающий резистор
// attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
// attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin(115200); // настроить скорость com порт
irrecv.enableIRIn(); // включить приемник
}
//******************************************
void loop()
{
IR_resiver();
joystik();
AVTO();
TEMPERATURE();
//cam();
if ((millis()-time)>1000 && results.value ==0) //запуск процедур по таймеру
{
time = millis();
autolight();
fuel();
voltmetr();
}
}
//************Автоподогрев сидений***************
void TEMPERATURE()
{
float tmpr=tempOutput.getTemperature(); //прочтать температуру от датчика за бортом
float tmpr1=tempInput.getTemperature(); //прочтать температуру от датчика салона
float tmpr2=tempDriver.getTemperature(); //прочтать температуру от датчика сиденья водителя
float tmpr3=tempPassenger.getTemperature(); //прочтать температуру от датчика сиденья пассажира
if(int(tmpr) < 0) // если температура забортом ниже нуля тогда проверяем температуру внутри салона
{if(int(tmpr1) < 10) // если температура ниже +10 тогда проверяем температуру сидений
{if (int(tmpr2) <= -20) analogWrite (HEAT_DRIVER, 255); // если температура сиденья водителя ниже или равно -20 то включаем максимум
if ((int(tmpr2) < 0) && (int(tmpr2) < -10 )) analogWrite (HEAT_DRIVER, 192); // если температура между -10 и 0 то включаем подогрев выше среднего
if ((int(tmpr2) < 10) && (int(tmpr2) < 0 )) analogWrite (HEAT_DRIVER, 128); // если температура между 10 и 0 то включаем подогрев на среднею
if ((int(tmpr2) < 20) && (int(tmpr2) < 10 )) analogWrite (HEAT_DRIVER, 64); // если t между 20 и 10 то вкл минимум
if(int(tmpr2) >= 20) analogWrite (HEAT_DRIVER, 0); // если t больше или равно 20 то включаем
if (int(tmpr3) <= -20) analogWrite (HEAT_PASSENGER, 255); // тоже самое с сиденьем пассажира делаем!!!
if ((int(tmpr3) < 0) && (int(tmpr2) < -10 )) analogWrite (HEAT_PASSENGER, 192); //
if ((int(tmpr3) < 10) && (int(tmpr2) < 0 )) analogWrite (HEAT_PASSENGER, 128); //
if ((int(tmpr3) < 20) && (int(tmpr2) < 10 )) analogWrite (HEAT_PASSENGER, 64); //
if(int(tmpr3) >= 20) analogWrite (HEAT_PASSENGER, 0); //
}
else {analogWrite (HEAT_PASSENGER, 0); // если t больше +10 то выключаем подогрев обеих сиденьев
analogWrite (HEAT_DRIVER, 0);
}
}
Serial.write(int(tmpr));
Serial.write(int(tmpr1));
}
//************Включение света в авторежиме*************
void AVTO()
{
}
//*******************ИК приемник***********************
void IR_resiver()
{
if ((millis()-time)>1000 )
{
time = millis();
results.value=0;
}
if (irrecv.decode(&results))
{
if (results.value > 0 && results.value < 0xFFFFFFFF)
{
ir_dt = results.value;
bytes[0] = ir_dt & 0xFF; // преобразовать в 4-байта
bytes[1] = (ir_dt & 0xFF00) >> 8;
bytes[2] = (ir_dt & 0xFF0000) >> 16;
bytes[3] = (ir_dt & 0xFF000000) >> 24;
Serial.write( bytes,13); // отправить прочитаное значение компьютеру
if (old_ir == ir_dt){delay(300);} // Пауза после нажатия и удержания(перед повторами)
else {delay(500);}
old_ir = ir_dt;
}
if (results.value == 0xFFFFFFFF )
{
delay(130); //пауза между повторами
Serial.write( bytes,13);
}
irrecv.resume();
}
}
//****************резистивные кнопки**************************
void joystik()
{
res_dt = analogRead(JOYSTIK_PIN); // прочитать данные АЦП
if( res_dt < 1023 && results.value == 0)
{
delay(50); // пауза для проверки дребезга
if(res_dt == analogRead(JOYSTIK_PIN)) //если нет дребезга
{
bytes[0] = res_dt & 255; // преобразовать в 2-байта
bytes[1] = (res_dt & 768) >> 8;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,13); // отправить прочитаное значение компьютеру
delay(250); // Пауза между нажатиями
}
}
}
//******************Датчик освещения************************
void autolight()
{
byte light;
byte sens = analogRead(LIGHT_SENS)/4;
if ((sens > 0) && (sens<30)) {light = 2;}
if ((sens > 30) && (sens<60)) {light = 60;}
if ((sens > 60) && (sens<90)) {light = 90;}
if ((sens > 90) && (sens<120)) {light = 120;}
if ((sens > 120) && (sens<150)) {light = 150;}
if ((sens > 150) && (sens<190)) {light = 190;}
if (sens > 190) {light = 255;}
if(light != bytes[4]) // если были изменения
{
clear_buf();
bytes[4] = light;
Serial.write( bytes,13);
}
}
//*******************Измерение Напряжения***********************
void voltmetr()
{
temp = analogRead(VOLT_SENS)/4;
if(temp != bytes[5])
{
clear_buf();
bytes[5]=temp;
Serial.write( bytes,13);
}
}
//*******************Датчик топлива***********************
void fuel()
{
temp = analogRead(FUEL_SENS)/4;
if(temp != bytes[6])
{
clear_buf();
bytes[6]=temp;
Serial.write( bytes,13);
}
}
//*******************Активация веб камеры по сигналу ЗХ***********************
//void cam()
//{
// temp=digitalRead(back_cam);
// if(temp==HIGH && cam_status==0)
// {
// clear_buf();
// cam_status=255;
// bytes[1]=8;
// Serial.write( bytes,13);
// }
// if(temp==LOW && cam_status==255)
// {
// clear_buf();
// cam_status=0;
// bytes[1]= 9;
// Serial.write( bytes,13);
// }
//}
//*******************Активация веб камеры по сигналу ЗХ***********************
void clear_buf()
{
bytes[0] = 0;
bytes[1] = 0;
bytes[2] = 0;
bytes[3] = 0;
}
//*******************обработка прерывания***********************
//void doEncoderA()
//{
//cli();
// if(digitalRead(encoder0PinB)==HIGH){bytes[1]=24;}else{bytes[1]=15;}
// bytes[0] = 0;
// bytes[2] = 0;
// bytes[3] = 0;
// Serial.write( bytes,13);
//sei();
//}
//*******************обработка прерывания***********************
//void doEncoderB()
//{
//cli();
// if(digitalRead(encoder0PinA)==HIGH){bytes[1]=15;}else{bytes[1]=24;}
// bytes[0] = 0;
// bytes[2] = 0;
// bytes[3] = 0;
// Serial.write( bytes,13);
//sei();
//}