PHP код:
//http://compcar.ru
#include <IRremote.h>
byte bytes[13]; // 0-3 байт энкодер, рулевые кнопки, ИК приемник, веб камера
// 4 байт датчик света
// 5 байт датчик напряжения
// 6 байт датчик топлива
// 7-12 зарезервированы
int LIGHT_SENS = 0 ; // Вход датчика освещености
int JOYSTIK_PIN = 5 ; // Вход для рулевых Кнопок
int NC2_SENS = 4 ; // Вход датчика
int NC1_SENS = 5 ; // Вход датчика
int NC3_SENS = 6 ; // Вход датчика
int NC4_SENS = 7 ; // Вход датчика
int RECV_PIN = 11; //вход ИК приемника
int encoder0PinA = 2 ; //Вывод А энкодера
int encoder0PinB = 3 ; //Вывод В энкодера
unsigned long res_dt, ir_dt, old_ir, time;
byte temp, cam_status;
IRrecv irrecv(RECV_PIN);
decode_results results;
//******************************************
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder_botton, INPUT);
digitalWrite(encoder_botton, HIGH); // подключить подтягивающий резистор
pinMode(ledPin, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(5, HIGH); //блокируем АСС на время инициализации датчика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DA, OUTPUT);
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin(115200); // настроить скорость com порт
tempSensor.begin(4); //Вешаем Датчик на 4 порт
irrecv.enableIRIn(); // включить приемник
}
//******************************************
void loop()
{
IR_resiver();
led();
acc();
joystik();
fm();
if ((millis()-time)>1000 && results.value ==0) //запуск процедур по таймеру
{
time = millis();
autolight();
fuel();
voltmetr();
}
}
//*******************ИК приемник***********************
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 led()
{
sens = analogRead(0);
if ((sens > 0) && (sens<10)) {light = 10;}
if ((sens > 10) && (sens<20)) {light = 50;}
if ((sens > 20) && (sens<30)) {light = 100;}
if ((sens > 30) && (sens<40)) {light = 150;}
if ((sens > 40) && (sens<50)) {light = 180;}
if ((sens > 50) && (sens<60)) {light = 210;}
if ((sens > 70) && (sens<80)) {light = 230;}
if (sens > 80) {light = 255;}
analogWrite(ledPin, light);
Serial.print(sens, DEC);
Serial.print(" ");
delay(300);
}
//*******************Нагреватель***********************
void acc()
{
if(tempSensor.isValid()==1 | tempSensor.isValid()==2)
{
tempSensor.reset();
digitalWrite(5, LOW); // если датчик не исправен , то разблокируем АСС
return;
}
float tmpr=tempSensor.getTemperature(); //прочтать температуру от датчика
if(int(tmpr) < 0) digitalWrite(5, HIGH);//если температура ниже ноля, включить подогрев
if(int(tmpr) > 0) digitalWrite(5, LOW);//если температура выше ноля, выключить подогрев
// Serial.print(int(tmpr)); //округлить до целой и отправить температуру
// Serial.println(); //перенос строки
}
//****************резистивные кнопки**************************
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); // Пауза между нажатиями
}
}
}
//****************FM радио**************************
void fm()
{
int inRF;
byte p[2];
int t;
ReadSteering();
// Длина команды 8 байт, формат:
// rfXXXXX<cr>
t = Serial.available();
if (t >= 8)
{
p[0] = Serial.read();
p[1] = Serial.read();
if ( p[0]==114 and p[1]==102 )
{
inRF = 1;
for (int x=3; x>=0; x--)
{
inRF += (int(Serial.read())-48) * pow(10, x);
}
Serial.flush();
if (inRF >= 875 and inRF <= 1080) {SetRF(inRF); SendOK();}
else {SendERR();}
}
else {SendERR();}
}
else
{
if (t > 0) {Serial.flush(); SendOK();}
}
delay(100);
}
// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()
{
byte bytes[2];
unsigned int res_dt1 = analogRead(0); // прочитать данные АЦП
delay(50);
unsigned int res_dt2 = analogRead(0); //проверка дребезга
if (abs(res_dt1-res_dt2)<=20 and res_dt1<1000 ) //если нет дребезга и что-то есть
{
bytes[0] = 255;
bytes[1] = res_dt1 & 255; // преобразовать в 2-байта
bytes[2] = (res_dt1 & 768) >> 8;
Serial.write( bytes,3); // отправить прочитаное значение компьютеру
}
/*Serial.print(res_dt1,DEC);
Serial.print(" ");
Serial.println(res_dt2,DEC);*/
}
void SetRF(int RF)
{
RF += 107;
// Выставляем CE, говорим что пишем в LM
digitalWrite(CE, HIGH);
writeToLM(byte(RF));
writeToLM(byte(RF >> 8));
writeToLM(135);
// Снимаем CE, все отправили
digitalWrite(CE, LOW);
}
void writeToLM(byte ByteToSend)
{
int D;
int D1;
delayMicroseconds(LM_DELAY);
for (int x=0; x<=7; x++)
{
// Выставляем DA
D = ByteToSend >> 1;
D1 = D << 1;
if (ByteToSend==D1) // Значит был 0
{
digitalWrite(DA,LOW);
}
else
{
digitalWrite(DA,HIGH);
}
// Формируем строб CL
digitalWrite(CL, HIGH);
delayMicroseconds(LM_DELAY);
digitalWrite(CL,LOW);
delayMicroseconds(LM_DELAY);
ByteToSend = ByteToSend >> 1;
}
delayMicroseconds(LM_DELAY);
}
void SendOK()
{
Serial.println("OK");
}
void SendERR()
{
Serial.println("ER");
}
//******************Датчик освещения************************
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 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();
}