Показано с 1 по 2 из 2
  1. #1
    Новичок
    Регистрация
    25.11.2012
    Сообщений
    10
    Вес репутации
    152

    По умолчанию Мой первый софт, авто подогрев сидений и автовключение света.

    Первый раз делаю под Ардуино так что прошу не пинать особо, часть скеча взята с темы All-in-one ну и адаптированно под свои нужны, и сформировалось ряд вопросов:
    1. Как Ардуино понимает какие на какие копыта я хочу подать сигнал или взять его, речь идет об Arduino mega 2560 у меня номера ШИМ и Аналоговых входов совпадают, и как понять он понял, что я хочу или нет.
    2. Кто может подсказать номер быстрого Оптрона и Транзистора мощностью 10 ампер требуется для ШИМ модуляции подогревателя, что бы температуру программно регулировать.
    3. Как считать проверку, заведен двигатель или нет, какое там значение должно быть на входе, а то не хочеться что бы аккум сел раньше чем я заведу машину.
    Ну и собственно скеч, код для автосвета не написан еще, голова и так болит, завтра доделаю.

    PS если не появится как у всех в отдельном окне с ползунком, то не бейте я не знаю как это сделать, а на форуме не нашел.


    PHP код:
    #include <IRremote.h>
    #include <DallasTemperature.h>   
    DallasTemperature tempInputtempOutputtempDrivertempPassenger ;
    byte bytes[13];    // 0-3 байт   энкодер, рулевые кнопки, ИК приемник, веб камера  
                      //   4 байт   датчик света
                      //   5 байт   датчик напряжения 
                      //   6 байт   датчик топлива 
                      //   7-12 зарезервированы                   
      
    int LIGHT_SENS ;   // Вход датчика освещености аналог вход
    int VOLT_SENS ;    // Вход датчика напряжения Аналог вход
    int FUEL_SENS ;    // Вход датчика уровня топлива аналог вход
    int MOTOR // Вход контроля запуска двигателя аналог
    int RECV_PIN ;     //вход ИК приемника аналог
    int JOYSTIK_PIN ;  // Вход для рулевых Кнопок аналог вход
    int AVTO_LIGHT_ON ;// Вход кнопки переключения света в автоматический режим аналог
    int TEMP_INPUT 22 //Вход датчика температуры салона 
    int TEMP_OUTPUT 24 ;    // Вход датчика температуры забортом.
    int TEMP_DRIVER 26 ;    // Вход датчика  сиденья водителя
    int TEMP_PASSENGER 28 ;    // Вход датчика сиденья пассажира


    int HEAT_DRIVER ;  // Выход шим нагрев водительского сиденья
    int HEAT_PASSENGER 12 // Выход шим нагрев пассажирского сиденья
    int AVTO_LIGHT // Выход шим Свет в авто режиме.

     
    // int back_cam = 6; //Вход активации камера заднего вида 
    // int encoder0PinA = 2 ; //Вывод А энкодера 
    // int encoder0PinB = 3 ; //Вывод В энкодера 
    // int encoder_botton = 4; //Вход кнопки энкодера 
      
    unsigned long res_dtir_dtold_irtime
    byte tempcam_status
    IRrecv irrecv(RECV_PIN);  
    decode_results results
      
    //****************************************** 
    void setup()      
    {


    pinMode (TEMP_INPUTINPUT); // Устанавливаем порт на вход дачика t салона
    tempInput.begin(TEMP_INPUT);
    pinMode (TEMP_OUTPUTINPUT); // Устанавливаем порт на вход датчика t забортом
    tempOutput.begin(TEMP_OUTPUT);
    pinMode (TEMP_DRIVERINPUT); // Устанавливаем порт на вход датчика t водительского сиденья
    tempDriver.begin(TEMP_DRIVER);
    pinMode (TEMP_PASSENGERINPUT); // Устанавливаем порт на вход датчика t пассажирского сиденья
    tempPassenger.begin(TEMP_PASSENGER);
    pinMode (HEAT_DRIVEROUTPUT); // Устанавливаем ШИМ-порт на выход подогрева водительского сиденья
    pinMode (HEAT_PASSENGEROUTPUT); // Устанавливаем ШИМ-порт на выход подогрева пассажирского сиденья
    pinMode (AVTO_LIGHTOUTPUT); // Устанавливаем ШИМ-порт на выход автоматического света
      
    //  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) <= -20analogWrite (HEAT_DRIVER255); // если температура сиденья водителя ниже или равно -20 то включаем максимум
                                          
    if ((int(tmpr2) < 0) && (int(tmpr2) < -10 )) analogWrite (HEAT_DRIVER192); // если температура между -10 и 0 то включаем подогрев выше среднего
                                          
    if ((int(tmpr2) < 10) && (int(tmpr2) < )) analogWrite (HEAT_DRIVER128); // если температура между 10 и 0 то включаем подогрев на среднею
                                          
    if ((int(tmpr2) < 20) && (int(tmpr2) < 10 )) analogWrite (HEAT_DRIVER64); //  если t между 20 и 10 то вкл минимум
                                          
    if(int(tmpr2) >= 20analogWrite (HEAT_DRIVER0); // если t больше или равно 20 то включаем
                                          
    if (int(tmpr3) <= -20analogWrite (HEAT_PASSENGER255); // тоже самое с сиденьем пассажира делаем!!!
                                          
    if ((int(tmpr3) < 0) && (int(tmpr2) < -10 )) analogWrite (HEAT_PASSENGER192); //
                                          
    if ((int(tmpr3) < 10) && (int(tmpr2) < )) analogWrite (HEAT_PASSENGER128); //
                                          
    if ((int(tmpr3) < 20) && (int(tmpr2) < 10 )) analogWrite (HEAT_PASSENGER64); //
                                          
    if(int(tmpr3) >= 20analogWrite (HEAT_PASSENGER0); //
                                          
    }  
                                         else {
    analogWrite (HEAT_PASSENGER0); // если t больше +10 то выключаем подогрев обеих сиденьев
                                               
    analogWrite (HEAT_DRIVER0);
                                               }    
                       }
                    
       
    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 && 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.writebytes,13); // отправить прочитаное значение компьютеру  
      
          
    if (old_ir == ir_dt){delay(300);} // Пауза после нажатия и удержания(перед повторами) 
          
    else {delay(500);} 
          
    old_ir ir_dt
        }  
               if (
    results.value == 0xFFFFFFFF 
                { 
                 
    delay(130); //пауза между повторами 
                 
    Serial.writebytes,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.writebytes,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.writebytes,13); 
         }       
    }  
    //*******************Измерение Напряжения*********************** 
    void voltmetr() 

        
    temp analogRead(VOLT_SENS)/4
          if(
    temp !=  bytes[5]) 
          { 
            
    clear_buf(); 
            
    bytes[5]=temp;  
             
    Serial.writebytes,13); 
          } 

    //*******************Датчик топлива*********************** 
    void fuel() 

          
    temp analogRead(FUEL_SENS)/4
          if(
    temp !=  bytes[6]) 
          { 
            
    clear_buf(); 
            
    bytes[6]=temp
             
    Serial.writebytes,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();     
    //} 
    Последний раз редактировалось Alexx13; 09.02.2013 в 08:08.

  2. #2
    Пользователь
    Регистрация
    15.10.2012
    Возраст
    35
    Сообщений
    30
    Вес репутации
    157

    Лампочка Re: Мой первый софт, авто подогрев сидений и автовключение света.

    по поводу заведенного двигателя: может просто посчитать обороты? заодно и тахометр будет))
    то есть с датчика Холла или откуда там у тебя идут импульсы на зажигание считываешь, и если больше нуля то двигатель заведен)
    если же не получится отработать тахометром, то можно опираться на напругу в бортсети. замерь напряжение на проводе вольтметра ардуины на стоячем двигателе (например 11,8 В) и при заведенном (13,2 В) и делай выводы) но имхо вариант с тахометром будет надежнее
    также тахометр будет полезен при построении автосвета (ДХО я так понимаю?) то есть если двигло работает и не включен ручник, то включаем выход на свет а ежели стоит на ручнике или двиг остановлен, то дхо гаснет. так что советую сделать именно тахометр
    Последний раз редактировалось hoster; 08.02.2013 в 18:46.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •