чувствительность фоторезистора как то программно управляется? или прописано постоянное значение? Можно ли менять предел регулировки яркости?
чувствительность фоторезистора как то программно управляется? или прописано постоянное значение? Можно ли менять предел регулировки яркости?
Можно изменять программно
PHP код:
//******************Датчик освещения************************
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);
}
}
В качестве Ик-приемника можно использовать TSOP2136 - ИК приёмник-демодулятор, 36 кГц, 2.5 - 5.5В, -25..+85°С ???
Как загнать прошивку в Carduino Nano Duo ???
Вот эту тему читал?
Немного изменил схему, и попытался написать код, а точнее попробовал слепить из тех что нашел в одну. Ошибки есть, если можно проверить и поправить. Прочитал http://www.compcar.ru/forum/showthread.php?t=4296 но еще не все понял как работает
В программе еще не учтены выходы на реле
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();
}
Последний раз редактировалось 496385290; 08.04.2011 в 01:36.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)