Найти ошибку в коде

Тема в разделе "Arduino & Shields", создана пользователем Boris_Britwa, 11 фев 2014.

  1. Boris_Britwa

    Boris_Britwa Нуб

    Не корректно отрабатывает участок кода выделенный красным ,тестером меряешь все ок(т.е управление работает нормально пока не подключил светодиоды). Но когда подключаем оба светодиода они светится еле еле в этот момент на светодиодах 1,7 в. Порты прове
    рял ок на другом коде.


    Код (Text):
    #include <LiquidCrystal.h>

    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    int val=0;
    int sec = 0;
    int  lastSec = 0;
    int  minute = 0 ;
    int  lastMin=0;
    int  hour=0;
    int lastTime2=0;
    int lastTime3=0;
    int  brightness=0;
    byte b=0;
    byte n=0;
    #define PWM_PIN  9
    #define LED_PIN  7
    #define LED_PIN2 8
    #define BAT_PIN      A0
    #define BAT_PIN2    A1


    float U ;
    float U2 ;

    ////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    void setup() {
      // declare pin 9 to be an output:
      pinMode(9, OUTPUT);
      //analogWrite(9,50);
      // set up the LCD's number of columns and rows:
      lcd.begin(16, 2);
      // Print a message to the LCD.
      lcd.setCursor(0, 1);
      Serial.begin(9600);              //установка порта на скорость 9600 бит/сек

    }
    /////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////
    void loop() {



      // set the cursor to column 0, line 1
      // (note: line 1 is the second row, since counting begins with 0):
      // print the number of seconds since reset:
      unsigned long currentMillis = millis();
      int time = (millis()/900)%2 ;
      int time2 = (millis()/300)%20 ;
      int time3 = (millis()/1000)%2 ;
      /////////////////////////////////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////////////////////////////////Будем обрабатывать блютуз    
      if (Serial.available()) {        //если есть принятый символ,
        val = Serial.read();
      }
      //  то читаем его и сохраняем в val
      else if (val == '1') {              
        hour=(hour+1)%24;
        val=0;
      }
      else  if (val == '2') {              
        minute=(minute+1)%60;
        val=0;
      }

      else if (val == '3'and hour >0) {            
        hour=(hour-1);
        val=0;
      }
      else  if (val == '4'and minute > 0) {              
        minute=(minute-1);
        val=0;
      }
      else  if (val == '5') {              
        b=!b;
        digitalWrite(LED_PIN,b);
      }
      else  if (val == '6') {              
        n=!n;
        digitalWrite(LED_PIN2,n);
        val=0;
      }








      /////////////////////////////////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////////////////////////////////    

      if (time3!=lastTime3){

        Serial.print ("Time =  ");
        Serial.print (hour);
        Serial.print (" : ");
        Serial.print(minute);
        Serial.print (" : ");
        Serial.println(sec);


        Serial.print ("U1 = ");
        Serial.print(U);
        Serial.print ("B");
        Serial.print(";");
        Serial.print (" U2 = ");
        Serial.print(U2);
        Serial.print ("B");
        Serial.println(";");


        Serial.print("LED1 =  ");
        Serial.print (b);
        Serial.print(";");
        Serial.print("  LED2 =  ");
        Serial.print (n);  
        Serial.println(";");  
        Serial.print("PWM =  ");
        Serial.print( brightness);
        Serial.println(";");
        Serial.println();
        lastTime3 = time3;


        U = analogRead(BAT_PIN) / 1024.0 * 5.0;// меррям батарейки
        U2 = analogRead(BAT_PIN2) / 1024.0 * 5.0;
      }

      //////////////////////////////////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////////////////////////////////
      //Здесь ведем расчет вермени для отображения на лсд
      sec=(millis()/1000)%60;//расчитываем колличество секунд зациклив их на 60
      if (lastSec==59 and lastSec!=sec)
        minute=(minute+1)%60;
      if (sec!=lastSec){
        lastSec=sec;  //бес этого будет сумировать одну и туже секунду
        /////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////
        brightness= map(sec, 0, 59, 0, 255);//меняем частоту шима
        analogWrite(PWM_PIN, brightness);

        /////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////      
      }
      if (lastMin==59 and lastMin!=minute)
        hour=(hour+1)%24;
      if (minute!=lastMin)//бес этого будет сумировать одну и туже min
          lastMin=minute;
      //////////////////////////////////////////////////////////
      //////////////////////////////////////////////////////////
      ///////////////////////////////////////////////////////////
      //////////////////////////////////////////////////////////  Вывод бегающей надписи
      if (time2 == 0 ){
        lcd.setCursor(0, 0);
        lcd.print("    ");

      }
      else  if (time2 ==1 ){
        lcd.setCursor(0, 0);
        lcd.print("    ");


      }
      //////////////////////////////////
      else  if (time2 ==2){
        lcd.setCursor(0, 0);
        lcd.print("    ");


      }
      //////////////////////////////////
      else  if (time2 ==3){
        lcd.setCursor(0, 0);
        lcd.print("    ");


      }
      /////////////////////////////////
      else  if (time2  ==4){
        lcd.setCursor(0, 0);
        lcd.print("    " );
      }
      ////////////////////////////////////
      else  if (time2 ==5){
        lcd.setCursor(0, 0);
        lcd.print("    ");


      }
      ////////////////////////////////////
      else  if (time2==6){
        lcd.setCursor(0, 0);
        lcd.print("    " );


      }
      /////////////////////////////////////
      else  if (time2 ==7){
        lcd.setCursor(0, 0);
        lcd.print("    ");


      }
      /////////////////////////////////////
      else  if (time2 ==8){
        lcd.setCursor(0, 0);
        lcd.print("    ");


      }
      ///////////////////////////////////////////
      else  if (time2==9){
        lcd.setCursor(0, 0);
        lcd.print("    ");
      }
      /////////////////////////////////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////////////////////////////////      Выводим напряжения с аналаговых входов
      //  else  if (time2 ==11 and lastTime2 != lastTime2 ){
      else  if (time2 ==11  ){

        lcd.setCursor(0, 0);
        lcd.print("U=              ");
        lcd.setCursor(2,0);
        lcd.print(U);
        lcd.setCursor(6, 0);
        lcd.print("B");
        lcd.setCursor(8,0);
        lcd.print("U=");  
        lcd.setCursor(10, 0);
        lcd.print(U2);
        lcd.setCursor(14,0);
        lcd.print("B");
        //    lastTime2=lastTime2+1;
      }
      ///////////////////////////////////////////////////////////////////////////////////////////////////////////            
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////мигающая надпись перед часами
      if (time){
        lcd.setCursor(0, 1);
        lcd.print("Total ");
      }
      else {
        lcd.setCursor(0, 1);

        lcd.print(" Time");
      }

      /////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////Bввод часов
      lcd.setCursor(8, 1);
      lcd.print(":");
      if (hour <10){
        lcd.setCursor(6, 1);
        lcd.print("0");
        lcd.setCursor(7, 1);
        lcd.print(hour);
      }
      else if
        (hour >9){
        lcd.setCursor(6, 1);
        lcd.print(hour);
      }

      ///////////////////////////////////////////////////////
      //////////////////////////////////////////////////////Вывод минут с выравниванием по экрану
      if (minute <10){
        lcd.setCursor(9, 1);
        lcd.print("0");
        lcd.setCursor(10, 1);
        lcd.print(minute);
      }
      else if
        (minute >9){
        lcd.setCursor(9, 1);
        lcd.print(minute);
      }
      ///////////////////////////////////////////////////////
      //////////////////////////////////////////////////////
      if (time3){              //мигаем двуеточием
        lcd.setCursor(11, 1);
        lcd.print(":");
      }
      if (!time3){
        lcd.setCursor(11, 1);
        lcd.print(" ");
      }
      ///////////////////////////////////////////////////////
      //////////////////////////////////////////////////////
      if (sec <10){
        lcd.setCursor(12, 1);
        lcd.print("0");
        lcd.setCursor(13, 1);
        lcd.print(sec);
      }
      else if(sec >9){
        lcd.setCursor(12, 1);
        lcd.print(sec);
      }  
      ///////////////////////////////////////////////////////
      //////////////////////////////////////////////////////            

    }

     
     
    Последнее редактирование: 12 фев 2014
  2. rav_75

    rav_75 Гик

    pinMode(LED_PIN, OUTPUT);
    pinMode(LED_PIN2, OUTPUT);
     
    Megakoteyka и acos нравится это.
  3. acos

    acos Официальный гик Администратор

    При этом сранно, что всё-таки светятся. У вас светодиоды как включены? Нулём включаются или единицей?
     
  4. rav_75

    rav_75 Гик

    Чисто полюбопытствовать, если сделать так:
    pinMode(LED_PIN, INPUT);
    digitalWrite(LED_PIN, HIGH);
    включится подтяжка?
    Если включится, то увидим мы что-нибудь на выхлопе LED_PIN или это внутримикроконтроллерная (во как!) каша и на ногу ничего не выходит?
    Если увидим, то хватит ли этого "чего-нибудь", чтоб светодиод "тлел"?
    Чисто теоретически, по этой причине у ТС такие кренделя.
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    А еще почитайте про оператор switch - он поможет сделать код более опрятным и лучше читаемым.
     
  6. acos

    acos Официальный гик Администратор

    Это первое, что приходит в голову:) Надо, наконец, уже заглянуть в исходники, и увидеть, как там работает digitalWrite. Если б мы имели дело напрямую с регистрами, то так бы оно и было (для этого, правда должно совпасть, что светодиоды у ТС включаются единицей). Твист на подтяжках:)
     
    Последнее редактирование: 12 фев 2014
  7. acos

    acos Официальный гик Администратор

    Причем настраивать ногу на вход для такого поведения не обязательно. При старте, по умолчанию, все ноги контроллера работают в самом безопасном для периферии режиме - вход без подтяжки, или «High Z». Вот и тут, ноги контроллера при старте - в режиме "хз", и если digitalWrite в итоге просто меняет бит в регистре PORTx на 1, то, при настроенном регистре DDRx на вход (отвечает за направление порта), будет врублена подтяжка.
     
    Последнее редактирование: 12 фев 2014
  8. Boris_Britwa

    Boris_Britwa Нуб

    Как я не заметил?)))