Вывод значения в 1-у строку lcd16x2

Тема в разделе "Микроконтроллеры AVR", создана пользователем Максим B, 26 ноя 2015.

  1. Максим B

    Максим B Гуру

    Всем привет. В программирование еще только учусь. Собственно есть код -это вывод значений в 2-е строки. Как удалить 2-. строку?

    Код (Text):

    void printValues(){
      char buf[16];
      char tbuf[6];
      char templ[]={' ','%','s',char(223),'C',' ','%','3','d','%','%',' ',' ',' ','\0'};
      for (int i=0; i<2; i++) {
        if (b[i] > 50){
          templ[13] = char(219);
        }
        else {
          templ[13] = char(161);
        }
        dtostrf(t[i],5,1,tbuf);
        sprintf(buf, templ, tbuf, h[i]);
        lcd.setCursor(0, i);
        lcd.print(buf);
      }
    }
     
     
  2. Максим B

    Максим B Гуру

    Сам поправил, но на сколько это корректно ?
    Код (Text):

    void printValues(){
      char buf[16];
      char tbuf[6];
      char templ[]={' ','%','s',char(223),'C',' ','%','3','d','%','%',' ',' ',' ','\0'};
      for (int i=0; i<1; i++) {
        if (b[i] > 50){
          templ[13] = char(219);
        }
        else {
          templ[13] = char(161);
        }
        dtostrf(t[i],5,1,tbuf);
        sprintf(buf, templ, tbuf, h[i]);
        lcd.setCursor(0, i);
        lcd.print(buf);
      }
    }
     
     
  3. geher

    geher Гуру

    Несколько бессмысленно использование цикла на одну итерацию с выводом данных только из нулевых элементов массивов b, t и h.

    Так логичнее будет.
    Код (C++):
    void printValues(){
      char buf[16];
      char tbuf[6];
      char templ[]={' ','%','s',char(223),'C',' ','%','3','d','%','%',' ',' ',' ','\0'};
      if (b[0] > 50){
        templ[13] = char(219);
      }
      else {
        templ[13] = char(161);
      }
      dtostrf(t[0],5,1,tbuf);
      sprintf(buf, templ, tbuf, h[0]);
      lcd.setCursor(0, 0);
      lcd.print(buf);
      }
    }
     
    Максим B нравится это.
  4. Максим B

    Максим B Гуру

    СПАСИБО

    Может и с этим сможете помочь ? Делаю переключение по кнопке как вот здесь на видео

    ? у меня просто выводится одна строка на другой - почему так? Переделываю проект обсуждаемый здесь : http://arduino.ru/forum/proekty/meteostantsiya-s-chasami#comment-150337

    Код (Text):

    void loop () {
      noInterrupts();
      word p = pulse;

      pulse = 0;
      interrupts();

      if (p != 0) {
        if (orscV2.nextPulse(p)) {
          reportSerial("OSV2", orscV2);  
          digitalWrite(LED, HIGH);
          ledNow = millis()+200;
        }
      }

      // Update the debouncer
      bouncer.update ( );
       // Get the update value
      int value = bouncer.read();
     
     
     
      if ((millis() >= dispNow)|| ( value == HIGH)) {
        printValues();
        dispNow=millis()+20000;
      }
     
      if (millis() >= ledNow) {
        digitalWrite(LED, LOW);
      }
    }

    float temperature(const byte* data)
    {
      int sign = (data[6]&0x8) ? -1 : 1;
      float temp = ((data[5]&0xF0) >> 4)*10 + (data[5]&0xF) + (float)(((data[4]&0xF0) >> 4) / 10.0);
      return sign * temp;
    }

    byte humidity(const byte* data)
    {
      return (data[7]&0xF) * 10 + ((data[6]&0xF0) >> 4);
    }

    // Ne retourne qu'un apercu de l'etat de la baterie : 10 = faible
    byte battery(const byte* data)
    {
      return (data[4] & 0x4) ? 10 : 90;
    }

    byte channel(const byte* data)
    {
      byte channel;
      switch (data[2])
      {
      case 0x10:
        channel = 1;
        break;
      case 0x20:
        channel = 2;
        break;
      case 0x40:
        channel = 3;
        break;
      }
      return channel;
    }

    void printValues(){
      char buf[16];
      char tbuf[6];
      char templ[]={' ','%','s',char(223),'C',' ','%','3','d','%','%',' ',' ',' ','\0'};
     
      switch (cDisp){
      case 0:
             if (b[0] > 50){
              templ[13] = char(219);
              }
              else {
                templ[13] = char(161);
              }
                  dtostrf(t[0],5,1,tbuf);
                  sprintf(buf, templ, tbuf, h[0]);
                  lcd.setCursor(0, 0);
                  lcd.print(buf);
             
                cDisp++;
      break;
      case 1:
                lcd.setCursor(0, 0);
                lcd.print("Меню2");
                cDisp++;
      break;
            }
     
      if (cDisp>1) cDisp=0;
       
      }
     
     
  5. Максим B

    Максим B Гуру

    Весь код специально не приложил, т.к. косяк точно только в loop и в printValues() исходник брал здесь http://medialounge.ru/files/weather_habr.zip У меня только обычная тактовая кнопка
     
    Последнее редактирование: 26 ноя 2015
  6. Максим B

    Максим B Гуру

    ООООчень нужна помощь .
     
  7. geher

    geher Гуру

    Не совсем понял, в чем проблема.
    Остаются хвосты от предыдущей картинки на дисплее при переключении режимов?
    Если так, то надо просто или очищать при смене режима экран вызовом lcd.clear() (не очень хорошо, будет моргать), или выводить данные таким образом, чтобы при выводе новой информации затиралась старая. А для этого надо всего лишь добить вывод пробелами для заполнения всей части экрана, которая должна быть обновлена.
    В данном конкретном случае отображение данных с погодного датчика занимает 14 позиций. А строка меню всего пять. Ее можно просто дополнить 9-ю пробелами, чтобы они переписали ту часть экрана, на которой выводились данные с датчика.
    И еще мелочь по работе с millis()
    Код (C):

    if ((millis() >= dispNow)|| ( value == HIGH)) {
        printValues();
        dispNow=millis()+20000;
      }
     
    При таком подходе, когда внутренний счетчик, возвращаемый функцией millis, приблизится к максимальному для unsigned long значения (2 в степени 32 без единицы) менее чем на 20000 (примерно раз в 50 дней), условие по времени будет верным всегда, пока счетчик не перевалит через ноль, поскольку millis будет возвращать очень большое число, в то время как значение dispNow (которое millis()+20000) за счет переполнения будет очень маленьким числом.
    Теоретически правильнее будет
    Код (C):

    if ((millis()-dispPrev>=20000)|| ( value == HIGH)) {
        printValues();
        dispPrev=millis();
      }
     
    За счет спецэффектов переполнения беззнакового целого в этом случае millis()-dispPrev всегда будет давать верный результат (время в миллисекундах, прошедшее с момента, записанного в dispPrev) до тех пор, пока эта разница не превысит возможности счетчика (то самое значение 2 в степени 32 без единицы).
    Естественно, это все при условии, что dispPrev и dispNow будут иметь тип unsigned long. Если это будет знаковое целое или целое меньшего размера (int или byte), то проблемы будут другого рода и начнутся достаточно быстро.
     
  8. Максим B

    Максим B Гуру

    Спасибо. Происходит такой эффект - если не нажата кнопка, тогда получается 2 пункта меню отображаются одновременно в одной строке и из-за этого происходит мерцание. Если нажать и удерживать кнопку, тогда отображается меню 1, если отпустить и снова нажать и держать -тогда 2 меню. По поводу кода выше- уже добавил ваш. Еще раз спасибо за разъяснение и помощь.
     
    Последнее редактирование: 27 ноя 2015
  9. Максим B

    Максим B Гуру

    Вообще задача- сделать 2 раздельных меню, 1 с отображением температуры, 2-е с временем и датой.