Всем привет. В программирование еще только учусь. Собственно есть код -это вывод значений в 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); } }
Сам поправил, но на сколько это корректно ? Код (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); } }
Несколько бессмысленно использование цикла на одну итерацию с выводом данных только из нулевых элементов массивов 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); } }
СПАСИБО Может и с этим сможете помочь ? Делаю переключение по кнопке как вот здесь на видео ? у меня просто выводится одна строка на другой - почему так? Переделываю проект обсуждаемый здесь : 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; }
Весь код специально не приложил, т.к. косяк точно только в loop и в printValues() исходник брал здесь http://medialounge.ru/files/weather_habr.zip У меня только обычная тактовая кнопка
Не совсем понял, в чем проблема. Остаются хвосты от предыдущей картинки на дисплее при переключении режимов? Если так, то надо просто или очищать при смене режима экран вызовом 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), то проблемы будут другого рода и начнутся достаточно быстро.
Спасибо. Происходит такой эффект - если не нажата кнопка, тогда получается 2 пункта меню отображаются одновременно в одной строке и из-за этого происходит мерцание. Если нажать и удерживать кнопку, тогда отображается меню 1, если отпустить и снова нажать и держать -тогда 2 меню. По поводу кода выше- уже добавил ваш. Еще раз спасибо за разъяснение и помощь.