Помогите с кодом на Arduino

Тема в разделе "Arduino & Shields", создана пользователем Витя350, 31 май 2015.

  1. Витя350

    Витя350 Нерд

    Код (Text):

    #include <LiquidCrystal.h>
    LiquidCrystal lcd(13, 12, 11, 10,  9,  8);
    boolean a = true;
    int sv;
    float rv;

    void setup()
    {
      pinMode(2, INPUT_PULLUP);
      pinMode(3, INPUT_PULLUP);
      pinMode(4, INPUT_PULLUP);
      lcd.begin(16,2);
      lcd.clear();
      lcd.print("B\xC3\xB2\xB8""p\xB8\xBF""e:");
      lcd.setCursor(0,1);
      lcd.print("V \xBE\xB8\xBF.: 5,12,9  ");
      while(a){
        if(digitalRead(2) || digitalRead(3) || digitalRead(4) == false){
          a = false;
        }
      }
      if(digitalRead(2) == false){
        sv = 5;
      } else if(digitalRead(3) == false){
        sv = 12;
      } else if(digitalRead(4) == false){
        sv = 9;
      }
      lcd.clear();
      lcd.print("B\xC3\xB2""pa\xBD""o:");
      lcd.setCursor(0,1);
      lcd.print(sv, 0);
      lcd.print("V");
      delay(3000);
      lcd.clear();
    }

    void loop()
    {
      rv = analogRead(A5) / 1024.0 * 10.0 * 4.0;
      if(sv == 5){
        if(rv == 5.0){
          lcd.clear();
          lcd.print("\x9B");
        }
        if(rv == 4.9){
          lcd.clear();
          lcd.print("\x9C");
        }
        if(rv == 4.8){
          lcd.clear();
          lcd.print("\x9D");
        }
        if(rv == 4.7){
          lcd.clear();
          lcd.print("\x9E");
        }
        if(rv == 4.6){
          lcd.clear();
          lcd.print("\x9F");
        }
      }
      if(sv == 9){
        if(rv > 8.5 && rv < 9.0){
          lcd.clear();
          lcd.print("\x9B");
        }
        if(rv > 8.0 && rv < 8.4){
          lcd.clear();
          lcd.print("\x9C");
        }
        if(rv > 7.5 && rv < 7.9){
          lcd.clear();
          lcd.print("\x9D");
        }
        if(rv > 7.0 && rv < 7.4){
          lcd.clear();
          lcd.print("\x9E");
        }
        if(rv > 6.5 && rv < 6.9){
          lcd.clear();
          lcd.print("\x9F");
        }
      }
      if(sv == 12){
        if(rv > 11.0 && rv < 12.0){
          lcd.clear();
          lcd.print("\x9B");
        }
        if(rv > 9.9 && rv < 10.9){
          lcd.clear();
          lcd.print("\x9C");
        }
        if(rv > 8.8 && rv < 9.8){
          lcd.clear();
          lcd.print("\x9D");
        }
        if(rv > 7.7 && rv < 8.7){
          lcd.clear();
          lcd.print("\x9E");
        }
        if(rv > 6.6 && rv < 7.6){
          lcd.clear();
          lcd.print("\x9F");
        }
      }
    }
     
    Должно быть так:
    1. Пишет : Выбирите
    V пит.: 5, 12, 9
    2. Нажимаю одну из кнопок каждая под каждым напряжением.
    3. Пишет : Выбрано:
    (5, 12, 9)V
    4. Сравнивает показания с различными напряжениями и высвечивает показания в виде
    заряженной/незаряженной батарейки (символы здесь: http://files.amperka.ru/datasheets/MT-16S2H.pdf )
    Но получается так:
    1. Не дает выбор, пишет: Выбрано:
    _V
    2. Дальше ничего не делает так как вариант для выбранного нуля не прописан.
    Помогите ко чем сможет, пожалуйста!
     
  2. Vad33

    Vad33 Капитан-оригинал

    Ну, видимо, вставить условие
    Код (Text):

    rv = analogRead(A5) / 1024.0 * 10.0 * 4.0;  // после этой строки

    if(rv > 0)     // ---  УСЛОВИЕ КОГДА >0
    {
    ....
    ....
    }
     
     
  3. Витя350

    Витя350 Нерд

    Вы наверное не так поняли. С кодом всё в порядке, но он почему то, выходит из команды while сразу же как только она проходит 1 раз. В коде написано:
    Код (Text):

    while(a){
        if(digitalRead(2) || digitalRead(3) || digitalRead(4) == false){
          a = false;
        }
     
    А ещё раньше:
    Код (Text):

    pinMode(2, INPUT_PULLUP);
    pinMode(3, INPUT_PULLUP);
    pinMode(4, INPUT_PULLUP);
     
    То есть каждый из 3 пинов на плюсе, а когда кнопка нажата пин этой кнопки замыкается на минус и цикл заканчивается. А из цикла, как я уже говорил, программа сразу от туда выходит.
     
  4. Vad33

    Vad33 Капитан-оригинал

    Значит проверяйте A5 или фото схемы в студию.
     
  5. X-Dron

    X-Dron Гик

    А если так
    rv =float (analogRead(A5)) / 1024.0 * 5.0 * 2.0;
     
  6. Витя350

    Витя350 Нерд

    В амперку выложить почему то не могу. Но могу по почте.
     
  7. Vad33

    Vad33 Капитан-оригинал

    Нужно сначала выложить на бесплатный фотохостинг, а потом уже ссылку
    вставить при ответе. Все нормально выкладывается.
    [​IMG]
     
  8. Megakoteyka

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

    Компилятор понимает это так:
    Код (Text):

    while(a){
        if(digitalRead(2) == true || digitalRead(3) == true || digitalRead(4) == false){
          a = false;
        }
     
    Исправьте условие.
     
  9. Витя350

    Витя350 Нерд

    Спасибо. А как правильно? У каждого false?
     
  10. Megakoteyka

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

    Да.
     
  11. X-Dron

    X-Dron Гик

    можно проще
    Код (Text):
    while(a){
        a= digitalRead(2) && digitalRead(3) && digitalRead(4);
        }
    Пока все в "1" - a=1 цикл крутится.
    Любая в "0" - a=0 выход из цикла.
    Вообще, если используются только булевые переменные есть смысл избавляться от условного оператора if. Исключением является организация триггера.
     
  12. Megakoteyka

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

    Код (Text):
    while(digitalRead(2) && digitalRead(3) && digitalRead(4)) ;
     
  13. X-Dron

    X-Dron Гик

    :)
    Ай, молодца. Как я сам не додумкал... :)
     
  14. Витя350

    Витя350 Нерд

    Только для моего кода надо почти также, но:
    Код (Text):
    while(digitalRead(2) || digitalRead(3) || digitalRead(4)) ;
    Поскольку надо выйти из цикла при нажатии любой кнопки.
     
  15. Витя350

    Витя350 Нерд

    Все, в этом месте всё заработало! Спасибо всем огромное! Но, проблема появилась другая.
    Как работает теперь:
    1. Запуск. Пишет: Выбирите
    V пит. 5, 12, 9
    2. Ждёт пока я нажму кнопку. Я нажимаю.
    3. Пишет: либо полностью закрашенный квадрат, либо μ.
    4. "Батарейка" не загорается.
     
  16. X-Dron

    X-Dron Гик

    Двойное считывание кнопки без фильтра антидребезга - плохое решение. При первом считывании можете поймать 0, при втором 1. Либо применяйте библиотеки антибребезга, либо организуйте программу так, чтобы считывать один раз. Например таким началом
    Код (Text):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(13, 12, 11, 10,  9,  8);
    int sv = 0;
    float rv;

    void setup()
    {
      pinMode(2, INPUT_PULLUP);
      pinMode(3, INPUT_PULLUP);
      pinMode(4, INPUT_PULLUP);
      lcd.begin(16,2);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("B\xC3\xB2\xB8""p\xB8\xBF""e:");
      lcd.setCursor(0,1);
      lcd.print("V \xBE\xB8\xBF.: 5,12,9  ");
      while(sv == 0){
        if(!digitalRead(2)) sv = 5;
        if(!digitalRead(3)) sv = 12;
        if(!digitalRead(4)) sv = 9;
      }
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("B\xC3\xB2""pa\xBD""o:");
      lcd.setCursor(0,1);
      lcd.print(sv, 0);
      lcd.print("V");
      delay(3000);
      lcd.clear();
    }
     
  17. Витя350

    Витя350 Нерд

    Спасибо большое!!!