Помогите!!! Создание 2х страничного LCD меню и управление кнопками

Xak.net
Offline
Зарегистрирован: 09.04.2018
Всем привет.
Нужна помощь, вот есть код. Нужно сделать так чтобы при нажатии кнопки выводилась только температура а при повторном нажатии выводилось только время работы. Пробовал с помощью flag не выходит. Как это осуществить? 
 
 
#include <Wire.h>                           // Подключаем библиотеку Wire
#include <LiquidCrystal_I2C.h>              // Подключаем библиотеку LiquidCrystal_I2C 
#include <DallasTemperature.h>              // Подключаем библиотеку DallasTempature
#define DS18B20 0                         // Указываем, к какому выводу подключена DQ
byte simvol[8]   = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса
LiquidCrystal_I2C lcd(0x38,20,4);           // Задаем адрес и размер дисплея
OneWire oneWire(DS18B20);                   
DallasTemperature sensors(&oneWire);
unsigned long TimeLightOffOn = 86397000;
int flag=0;
void setup()
{
  sensors.begin();                           // Запуск библиотеки, по умолчанию 9 бит, то есть кратность 0.5 градуса 
  lcd.init();                                // Инициализация lcd    
  lcd.backlight();                           // Включаем подсветку
  lcd.setCursor(5,0);                        // Устанавливаем курсор на 1 строку, ячейка 2
  lcd.print("Temperature");                         // Выводим текст
  lcd.setCursor(2,1);                        // Устанавливаем курсор на 2 строку, ячейка 1                
  lcd.createChar(1,simvol);                  // генерируем символ
}
void loop()
{
  sensors.requestTemperatures(); 
  int temp1 = sensors.getTempCByIndex(0);  // Считываем показания температуры
  byte Seconds = ((millis()+TimeLightOffOn)/1000UL)%60;
  byte Minutes  = (((millis()+TimeLightOffOn)/1000UL)/60UL)%60;
  byte Hours   = (((millis()+TimeLightOffOn)/1000UL)/3600UL)%24;
  lcd.setCursor(5,0);                        
  lcd.print("Temperature"); 
  lcd.setCursor(6,1);
  lcd.print("  ");                                              
  lcd.print(temp1);                           
  lcd.print("\1");                            // Выводим символ градуса                         
  lcd.print("C");
  lcd.print("  ");
  lcd.setCursor(3, 3);                   // кусок кода который  выводит время работы.
  lcd.print("Timer:");
  lcd.setCursor(9, 3);
  lcd.print(Hours);
  lcd.print(':');
  lcd.print(Minutes);
  lcd.print(':');
  lcd.print(Seconds);
  lcd.print("   ");
  lcd.print(" ");                           // 
  delay (1000);
  }
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Дорогой товарищ(господин,мистер,синьер), а Вы программировать можете? или так только стеб организовать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Для начала, вставьте код по правилам форума, пожалуйста.

Xak.net
Offline
Зарегистрирован: 09.04.2018

Могу немного, я всего лишь третий день этим занимаюсь. Мне просто нужна помощь вот и всё)

Xak.net
Offline
Зарегистрирован: 09.04.2018
#include <Wire.h>                           // Подключаем библиотеку Wire
#include <LiquidCrystal_I2C.h>              // Подключаем библиотеку LiquidCrystal_I2C 
#include <DallasTemperature.h>              // Подключаем библиотеку DallasTempature
#define DS18B20 0                         // Указываем, к какому выводу подключена DQ
byte simvol[8]   = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса
LiquidCrystal_I2C lcd(0x38,20,4);           // Задаем адрес и размер дисплея
OneWire oneWire(DS18B20);                   
DallasTemperature sensors(&oneWire);
unsigned long TimeLightOffOn = 86397000;
int flag=0;
void setup()
{
  sensors.begin();                           // Запуск библиотеки, по умолчанию 9 бит, то есть кратность 0.5 градуса 
  lcd.init();                                // Инициализация lcd    
  lcd.backlight();                           // Включаем подсветку
  lcd.setCursor(5,0);                        // Устанавливаем курсор на 1 строку, ячейка 2
  lcd.print("Temperature");                         // Выводим текст
  lcd.setCursor(2,1);                        // Устанавливаем курсор на 2 строку, ячейка 1                
  lcd.createChar(1,simvol);                  // генерируем символ
}
void loop()
{
  sensors.requestTemperatures(); 
  int temp1 = sensors.getTempCByIndex(0);  // Считываем показания температуры
  byte Seconds = ((millis()+TimeLightOffOn)/1000UL)%60;
  byte Minutes  = (((millis()+TimeLightOffOn)/1000UL)/60UL)%60;
  byte Hours   = (((millis()+TimeLightOffOn)/1000UL)/3600UL)%24;
  lcd.setCursor(5,0);                        
  lcd.print("Temperature"); 
  lcd.setCursor(6,1);
  lcd.print("  ");                                              
  lcd.print(temp1);                           
  lcd.print("\1");                            // Выводим символ градуса                         
  lcd.print("C");
  lcd.print("  ");
  lcd.setCursor(3, 3);                   // кусок кода который  выводит время работы.
  lcd.print("Timer:");
  lcd.setCursor(9, 3);
  lcd.print(Hours);
  lcd.print(':');
  lcd.print(Minutes);
  lcd.print(':');
  lcd.print(Seconds);
  lcd.print("   ");
  lcd.print(" ");                           // 
  delay (1000);
  }

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

на третий день, абычна, светодиод к вечеру мигать начинает.  А тут меню....  Не по Сеньке шапка, увы. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что конкретно у Вас не получается? Вы пишете про какую-то кнопку. В каких строках кода Вы с нею работаете? Я вот не вижу никакой работы с кнопкой, наверное слишком поверхностно посмотрел.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот, нашёл в лесу хворостину. Нужно сделать свирель к завтрему. Ковырял гвоздиком - не выходит. Как это делается? Решил стать свиреледелом три дня назад!

Xak.net
Offline
Зарегистрирован: 09.04.2018

#include <Wire.h>                           // Подключаем библиотеку Wire
#include <LiquidCrystal_I2C.h>              // Подключаем библиотеку LiquidCrystal_I2C 
#include <DallasTemperature.h>              // Подключаем библиотеку DallasTempature
#define DS18B20 0                         // Указываем, к какому выводу подключена DQ
 
byte simvol[8]   = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса
 
LiquidCrystal_I2C lcd(0x38,20,4);           // Задаем адрес и размер дисплея
OneWire oneWire(DS18B20);                   
DallasTemperature sensors(&oneWire);
unsigned long TimeLightOffOn = 86397000;
int flag=0;
void setup()
{
  sensors.begin();                           // Запуск библиотеки, по умолчанию 9 бит, то есть кратность 0.5 градуса 
  lcd.init();                                // Инициализация lcd    
  lcd.backlight();                           // Включаем подсветку
  lcd.setCursor(5,0);                        // Устанавливаем курсор на 1 строку, ячейка 2
  lcd.print("Temperature");                         // Выводим текст
  lcd.setCursor(2,1);                        // Устанавливаем курсор на 2 строку, ячейка 1                
  lcd.createChar(1,simvol);                  // генерируем символ

}
void loop()
{
  sensors.requestTemperatures(); 
  int temp1 = sensors.getTempCByIndex(0);  // Считываем показания температуры
  byte Seconds = ((millis()+TimeLightOffOn)/1000UL)%60;
  byte Minutes  = (((millis()+TimeLightOffOn)/1000UL)/60UL)%60;
  byte Hours   = (((millis()+TimeLightOffOn)/1000UL)/3600UL)%24;
  if (digitalRead(14)==HIGH&&flag==0){
  lcd.setCursor(3, 3);
  lcd.print("Timer:");
  lcd.setCursor(9, 3);
  lcd.print(Hours);
  lcd.print(':');
  lcd.print(Minutes);
  lcd.print(':');
  lcd.print(Seconds);
  lcd.print("   ");
  lcd.print(" ");
  }
  if (digitalRead(14)==LOW&&flag==1){
  lcd.setCursor(5,0);                        
  lcd.print("Temperature"); 
  lcd.setCursor(6,1);
  lcd.print("  ");                                              
  lcd.print(temp1);                           
  lcd.print("\1");                            // Выводим символ градуса                         
  lcd.print("C");
  lcd.print("  ");
  }
  //lcd.setCursor(5,0);                        
  //lcd.print("Temperature"); 
  //lcd.setCursor(6,1);
  //lcd.print("  ");                                              
  //lcd.print(temp1);                           
  //lcd.print("\1");                            // Выводим символ градуса                         
  //lcd.print("C");
  //lcd.print("  ");
  //lcd.setCursor(3, 3);
  //lcd.print("Timer:");
  //lcd.setCursor(9, 3);
  //lcd.print(Hours);
  //lcd.print(':');
  //lcd.print(Minutes);
  //lcd.print(':');
  //lcd.print(Seconds);
  //lcd.print("   ");
  //lcd.print(" ");
  delay (1000);
  }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Xak.net. И вот не ясно как Вам помогать, знаний у вас нет. А три дня это не срок разобраться что и как. Думаю вам и месяца не хватит разобраться в таком примитивном скетче.

/**/
unsigned long mill;// переменная для millis()
typedef void (*pDo)() ;// тип -функция обработчик
//------Cl_Display----------------------
// класс дисплей
class Cl_Display {
  protected:
    bool screen = 0;
    pDo Do1, Do2; //обработчики
  public:
    /*конструктор*/
    Cl_Display(pDo D1, pDo D2): Do1(D1), Do2(D2)  {}
    void init() { /*инициализация-вставить в setup()*/
      refresh();
    }
    void run() { /*работа-вставить в loop()*/
    }
    void refresh() { /*обновить*/
      screen = !screen;
      if (screen) Do1();
      else Do2();
    }
};
//------Cl_Btn----------------------
// класс кнопка
class Cl_Btn {
  protected:
    const byte pin;
    pDo Do;//обработчик
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    /*конструктор*/
    Cl_Btn(byte p, pDo D): pin(p), Do(D) {}

    void init() { /*инициализация-вставить в setup()*/
      pinMode(pin, INPUT_PULLUP);
    }
    void run() { /*работа-вставить в loop()*/
      bool tmp = digitalRead(pin);
      if (!bounce && tmp != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = tmp;
        if (!btn && oldBtn) Do();
      }
    }
};
//-----компоновка----------------------
void viev1() {
  Serial.println("screen1");
}
void viev2() {
  Serial.println("screen2");
}
Cl_Display Display(/*screen1*/viev1,/*screen2*/viev2);
void DoBtn() {
  Display.refresh();
}
Cl_Btn Btn1(/*пин*/2,/*обработчик*/DoBtn);
//-----main----------------------
void setup() {
  Serial.begin(9600);
  Display.init();
  Btn1.init();
}
void loop() {
  mill = millis();
  Display.run();
  Btn1.run();
}
/*Скетч использует 2086 байт (6%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 221 байт (10%) динамической памяти, оставляя 1827 байт для локальных переменных. Максимум: 2048 байт.
*/

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот, оказывается первый код был "для лохов", теперь новый появился?

Ну, так расскажите в чём проблема-то? Что работает не так?

Xak.net
Offline
Зарегистрирован: 09.04.2018

При нажатии на кнопку появляеться время работы а при повторном нажатии оно обновляется а мне нужно вернуться на вывод температуры

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

Уху, а в каком месте происходит событие, которое позволит выполнится строке №43?

ven-til
Offline
Зарегистрирован: 13.02.2018

bwn пишет:

Уху, а в каком месте происходит событие, которое позволит выполнится строке №43?

Торжественное поднятие флага происходит каждое утро на пионерской линейке. И абсолютно в каждом устройстве, на территории бывшего союза, если есть переменная flag, то она будет установлена в 1. Даже если устройство выключено в этот момент.

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

ven-til пишет:

Торжественное поднятие флага происходит каждое утро на пионерской линейке. И абсолютно в каждом устройстве, на территории бывшего союза, если есть переменная flag, то она будет установлена в 1. Даже если устройство выключено в этот момент.

Хм, не исключено. И хоть я помню эту процедуру, предпочитаю более традиционные способы эрегирования флагов.)))))

P/S Навеяло, когда в год сухого закона занесло меня на теплоходах поработать, там в обязанностях палубного матроса было на закате флаг снимать и убирать, а на восходе снова вывешивать. В пионерлагере ладно, там ритуал. А каков смысл этого действа на гражданской коробке, утреннюю процедуру кроме вахтенного и рулевого вообще никто не наблюдал?????

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это традиция. Когда-то давно, когда армии скорее напоминали толпы. И не понятно кто враг, а кто друг и куда двигаться- спользовался флаг (орел или прочая лабуда). Позже когда, армия начала делится на части-тактические единицы у каждой единицы был свой флаг или прапорщик.  и в конце концов все это плавно перешло в военный флот , а затем в гражданский.  Разумеется на лодках рыбаков флаги подымать не надо. Но флаг на судне обозначает , что это не что-то плавает, а администативно-территориальная единица со своим статусом. И что бы этот статус у не был, надо флаг подымать и опускать. А иначе просто болтается тряпка. Такой же принцип у пионерских лагерях.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Xak.net пишет:

При нажатии на кнопку появляеться время работы а при повторном нажатии оно обновляется а мне нужно вернуться на вывод температуры

ТАк возвращайтесь! В какой строке Вы пытаетесь это сделать?

Поймите, Вы должны сказть НЕ "мне нужно", а "я вот так сделал, вроде должно пахать, а не пашет". Что Вам нужно - это Ваши проблемы.

Здесь Вам могут помочь найти ошибку в ВАШЕМ коде, а писать код под Ваши хотелки - здесь не то место.