Как прекратить мерцание дисплея без потери функциональности?вот что я имею

lonely_jack
Offline
Зарегистрирован: 12.10.2015
//управление нагрузками (светом) при помощи ик пульта и тактовой кнопки. команды ик пульта прописывать отдельно
//red green blue можно выкинуть из скетча
#include <IRremote.h>
#include <Bounce.h>
#include <LiquidCrystal.h> //Подключаем библиотеку для работы с LCD
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON 6
#define led 13
#define RECV_PIN 9
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce(BUTTON,5); 


//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;
// переменные
int ledStat = 0;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  lcd.begin(16, 2);// задаем размерность дисплея

//определяем режимы работы пинов
  pinMode(BUTTON,INPUT);
  pinMode(led,OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Запуск приемника
pinMode(led, OUTPUT);
}

void loop() {
 

 //если сменилось состояние кнопки
  if ( bouncer.update() ) {
    //если считано значение 1
    if ( bouncer.read() == HIGH) {
     //если свет был выключен, будем его включать
     if ( ledValue == LOW ) {
       ledValue = HIGH;
     //если свет был включен, будем выключать
     } else {
       ledValue = LOW;
     }
     //записываем значение вкл/выкл на пин со светодиодом 
     digitalWrite(led,ledValue);
    }
  }
if (irrecv.decode(&results)) 
{
Serial.println(results.value);

//красный
if (results.value == 0xFF00FF
 && ledValue == 0)
{
digitalWrite(led, HIGH);
ledValue = 1;
}
else
if (results.value == 0xFF00FF

 && ledValue == 1)
{
digitalWrite(led, LOW);
ledValue = 0;
}



irrecv.resume(); // Получить слудующее значение
}
if ( ledValue == LOW ) {
  lcd.clear();
  lcd.setCursor(0, 0);     // устанавливаем курсор в 0-ом
  // столбце, 1 строке (начинается с 0)
  lcd.print("Light is OFF");
  
  lcd.setCursor(0, 1);     // устанавливаем курсор в 0-ом столбце, 2 строке
  lcd.print("PUSH BUTTON");        // просто буквы второй строкой

  }
  else {
    lcd.clear();
  lcd.setCursor(0, 0);     // устанавливаем курсор в 0-ом
  // столбце, 1 строке (начинается с 0)
  lcd.print("Light is ON");
  
  lcd.setCursor(0, 1);     // устанавливаем курсор в 0-ом столбце, 2 строке
  lcd.print("PUSH BUTTON");        // просто буквы второй строкой

}
}

 

lonely_jack
Offline
Зарегистрирован: 12.10.2015

по кнопке и пульту IR включается и выключается нагрузка. в целях изучения недавно полученного lcd пытаюсь его сюда пристроить. здесь все работает, только дисплей мерцает. Если добавить delay - то грузит всю программу(чего и ожидал). Погугливши - путного ничего не нашел. Как решить? Называю свой код "изящным" ))))

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

вместо lcd.clear(); делай lcd.print("               ");

lonely_jack
Offline
Зарегистрирован: 12.10.2015

спасибо, работает, только лишние символы не удаляет, в итоге получается при включенной нагрузке - Light is ONF . F осталась от предыдущей задачи и не стерлась

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

Light is ONF содержит 12 символов - сколько символов нужно, что бы перезаписать 12 символов?

lonely_jack
Offline
Зарегистрирован: 12.10.2015

Клапауций 070 пишет:

Light is ONF содержит 12 символов - сколько символов нужно, что бы перезаписать 12 символов?

Хочется, конечно, чтобы не Light is ONF, а Light is ON.

и , думаю, правильнее, наверное, подобные команды на чистый дисплей выдавать, чтобы строки не подгонять друг под друга по количеству символов

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

lonely_jack пишет:

Хочется, конечно, чтобы не Light is ONF, а Light is ON.

lcd.print("Light is OFF");
lcd.print("Light is ON ");
lcd.print("            ");

 

lonely_jack пишет:

и , думаю, правильнее, наверное, подобные команды на чистый дисплей выдавать, чтобы строки не подгонять друг под друга по количеству символов

правильнее печатать сверху напечатанного, что бы не тратить время и ресурсы на стирание.

lonely_jack
Offline
Зарегистрирован: 12.10.2015

ок, концепцию понял, спасибо))

а если, вдруг, заморочиться? наверное millis подойдет? как его сюда вставить? или может еще что?

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

lonely_jack пишет:

а если, вдруг, заморочиться? наверное millis подойдет? как его сюда вставить? или может еще что?

не совсем ясно, что ты имеешь ввиду.

lonely_jack
Offline
Зарегистрирован: 12.10.2015

имею в виду стирание экрана и вывод новых данных без мерцания

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

lonely_jack пишет:

имею в виду стирание экрана и вывод новых данных без мерцания

закоменти lcd.clear(); и не будет у тебя мерцания

lonely_jack
Offline
Зарегистрирован: 12.10.2015

а вот тут я не понял - его надо в константы/переменные ввести или в setup? можно пример строки?

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

// lcd.clear();

lonely_jack
Offline
Зарегистрирован: 12.10.2015

еще вопрос про lcd - если накрутил нужное сопротивление потенциометром для контраста дисплея - можно ли этот потенциометр на постоянный резистор заменить? себе представляю, что одну ногу резистора надо на VO (3 вывод), а вторую куда? на землю или питание?

lonely_jack
Offline
Зарегистрирован: 12.10.2015

Клапауций 070 пишет:

// lcd.clear();

но это же просто комментарий выйдет, а не программный код.

или то, что я хочу нерационально? а если подключать более продвинутые дисплеи - с подгоняловом строк не замучаешься?

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

lonely_jack пишет:

или то, что я хочу нерационально?

ты не сообщил, что ты хочешь.

lonely_jack
Offline
Зарегистрирован: 12.10.2015

нажал кнопку или кнопку пульта, как в данном скетче --> зажегся/погас светодиод, тем временем, на lcd высветилось on или off на дисплее(согласно состоянию светодиода), причем символы on или off не переписывают друг друга, а просто пишутся на сброшенный(чистый) дисплей (чтобы не считать количество символов в строках и не подгонять их  друг по друга).  Ну и, конечно, чтобы дисплей не мерцал и в любой момент схема воспринимала сигнал с кнопки и пульта, как без дисплея. дисплей и кнопки работают параллельно (ну или как то так), не мешая друг другу, а дисплей не мерцает. так себе это вижу

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

lonely_jack пишет:

а дисплей не мерцает. так себе это вижу

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

ты не поверишь, но кошек реально достаёт мерцание 60Гц твоего компа - срочно шото делай.

lonely_jack
Offline
Зарегистрирован: 12.10.2015

Спасибо за помощь))) еще остался вопрос

lonely_jack пишет:

еще вопрос про lcd - если накрутил нужное сопротивление потенциометром для контраста дисплея - можно ли этот потенциометр на постоянный резистор заменить? себе представляю, что одну ногу резистора надо на VO (3 вывод), а вторую куда? на землю или питание?

 

Alexander
Offline
Зарегистрирован: 25.04.2010

lonely_jack давайте не будем разводить флуд. 

lonely_jack
Offline
Зарегистрирован: 12.10.2015

куда все таки на землю или на питание?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

lonely_jack пишет:

куда все таки на землю или на питание?

в этом дисплее на землю.

lonely_jack
Offline
Зарегистрирован: 12.10.2015

Спасибо, коротко и ясно))

Сергей163
Offline
Зарегистрирован: 06.10.2018
Помогите! Как дописать код что бы секундомар включасля когда температура будет > 30 и останавливался (секундомер) когда температура < 30
 
 
//  Подключаем библиотеки
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <SPI.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
 
#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)
 
int temperPin1 = 13;
 
 
                                                   
 
 
//  Объекты 
Adafruit_BMP280 bmp(BMP_CS);                                           // датчик BMP280
 
 
unsigned long time0, time1; 
byte ms, s, m, h, ms1, s1, m1, h1, kn, pin, start1, stop1, blok;
 
 
void setup(){
  pinMode(8,INPUT);// кнопка на входе 8
 
  
   
 lcd.begin(16, 2);
 
  bool status;
 
  status = bmp.begin();
}
 
void loop(){
  kn = digitalRead(8); // считываем значение со входа 6
 
  if(kn == HIGH && start1 == 0 && blok == 0){ // запуск счета, первое нажатие кнопки
    start1 = 1;// если кнопка нажата start1 = 1, разрешен отсчет времени
    time1=millis(); // засекаем время нажатия кнопки
  }
  if(millis()-time1 <= 200){ // устраняем дребезг кнопки, блокировка нажатия 200 мс
    kn = LOW;
  } 
 
  if(kn == HIGH && start1 == 1 && stop1 == 0){// перенос данных во вторую строку, второе нажатие кнопки
    stop1 = 1; // было второе нажатие кнопки
    ms1 = ms; 
    s1 = s; 
    m1 = m; 
    h1 = h; 
    ms = 0;
    s = 0;
    m = 0;
    h = 0;
    time1 = millis(); // засекаем время нажатия кнопки kn = LOW;
  kn = LOW;start1 = 1;// запрещен отсчет времени
    blok = 1;// блокировка перехода на первое нажатие кнопки
    time1 = millis(); // засекаем время нажатия кнопки
  }
  if(millis() - time1 <= 200){ // устраняем дребезг кнопки, блокировка нажатия 200 мс
   
 
  
  } 
 
  if(kn == HIGH && start1 == 1 && stop1 == 1){// обнуление всех переменных, общий сброс
    ms1 = 0;
    s1 = 0;
    m1 = 0;
    h1 = 0;
    blok = 0;
    pin = 0;
    start1 = 1;
    stop1 = 0;
  }
    if(millis() - time1 <= 100){ // устраняем дребезг кнопки, блокировка нажатия 200 мс
 
  }
  if(start1 == 1){ // фиксация нажатия кнопки
    if(pin == 0){ // начало отсчета после нажатия кнопки
      time0 = millis();// устанавливаем время начала отсчета
      pin = 1;
    }
 
    if(millis() - time0 > 99){
      time0 = millis();
      ++ms; // отсчет 0,1 с
      if(ms > 9){
        ms = 0;
        ++s; // отсчет 1 с
      }
      if(s > 59){
        s = 0; 
        ++m; // отсчет 1 мин
      }
      if(m > 59){
        m = 0;
        ++h; // отсчет 1 час
      }
      if(h > 23){
        h = 0;
      }
    }
  }  
  lcd.clear();                                                      //  очистка экрана
 //  Выводим температуру
  lcd.print("T:");
  lcd.print(bmp.readTemperature(),1);
  lcd.print("\1");lcd.print("C");
 
  
// вывод информации на экран 1 строка
  lcd.setCursor(10,0); 
  if(h < 10){
  //lcd.print("0");
  }
  //lcd.print(h); // часы
  //lcd.print(":");
  if(m < 10 ){
  //lcd.print("0");
  }
  lcd.print(m); // минуты
  lcd.print(":");
  if(s < 10){
    lcd.print("0");
  }
  lcd.print(s);// секунды
  lcd.print(":");
  lcd.print(ms);// мс
  // вывод информации на экран 2 строка
  lcd.setCursor(10,1); 
  if(h1 < 10){
  //lcd.print("0");
  }
  //lcd.print(h1); // часы
  //lcd.print(":");
  if(m1 < 10 ){
  //lcd.print("0");
  }
  lcd.print(m1); // минуты
  lcd.print(":");
  if(s1 < 10){
    lcd.print("0");
  }
  lcd.print(s1);// секунды
  lcd.print(":");
  lcd.print(ms1);// мс
  lcd.home();
 
}
Alexander
Offline
Зарегистрирован: 25.04.2010
bwn
Offline
Зарегистрирован: 25.08.2014

Сергей163 пишет:

Помогите! Как дописать код что бы секундомар включасля когда температура будет > 30 и останавливался (секундомер) когда температура < 30
 

Сергей, вы действительно считаете, что запостив в двадцать тем повышаете шансы на помощь?

Сергей163
Offline
Зарегистрирован: 06.10.2018

Нет. Я просто не понимаю куда лучше добавить пост.

b707
Offline
Зарегистрирован: 26.05.2017

Сергей163 пишет:

Нет. Я просто не понимаю куда лучше добавить пост.

а новую тему создать не думали?

bwn
Offline
Зарегистрирован: 25.08.2014

Сергей163 пишет:

Нет. Я просто не понимаю куда лучше добавить пост.

В ветке "Общий", в самом начале "Песочница для новичков". Там есть ссылки как вставлять код и создавать тему. Почитайте, создайте тему и задайте свой вопрос. Скажу сразу, у вас вопрос некорректный, в теме  обозначьте, что пытались сделать для его решения, что пошло не так. Писать за вас никто не будет.

P/S Не, не так, будут, но за деньги, в "Ищу исполнителя".