оптимизация кода

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

И на что только люди не идут, чтобы только, не дай Бог, не почитать учебник и чему-нибудь, случайно не научиться..

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

Ворота пишет:

И на что только люди не идут, чтобы только, не дай Бог, не почитать учебник и чему-нибудь, случайно не научиться..

Зачем существует форум?

nik182
Offline
Зарегистрирован: 04.05.2015

Для общения по интересам. Ваши вопросы много раз обсасывались на форуме. Вон Пух привел несколько ссылок. Они по новой уже не интересны. Поищите. Есть ответы на все Ваши вопросы. Вам лень искать, нам лень в который раз писать одно и тоже. А для остального есть гугль и вики.

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

Valerich-tex пишет:

Зачем существует форум?

Дай угадаю. 

С точки зрения не умеющих читать и забаненых в гугале : Для растолковывания не хотящим учица идиотам неких прописных истин примерно в стопицотый раз. 

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

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

#include <Wire.h>
#include <SPI.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include <RTClib.h>
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
//DateTime now // datetime считывает время с модуля и выводит на команды


#include <GyverButton.h>
GButton butt2(10);
GButton butt1(5);


unsigned long zad;
bool mode = 0; //0-показ времени, 1-настройка времени
boolean blinkFlag, newTimeFlag;
int mins, hrs, ddd, mmm, yyy;
int znach;
char weeek;

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  rtc.begin();
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  //команда для прошивки времени, не забыть отключить ее на финальной прошивке

  DateTime now = rtc.now();
  mins = now.minute();
  hrs = now.hour();
  //weeek = daysOfTheWeek[now.dayOfTheWeek()];
  ddd = now.day();
  mmm = now.month();
  yyy = now.year();
}
void loop() {
  butt1.tick();
  butt2.tick();

  if (butt1.isHolded()/* && butt2.isHolded()*/) { //переход в режим установки времени
    mode ++;
    if (mode > 1) mode = 0;
  }
  if (butt2.isHolded()) {  //переход на новый устанавливаемый параметр
    znach ++;
    if (znach > 3) znach = 0;
  }
  if (mode == 0) {
    func_time();
  }

  if (mode == 1) {
    lcd.setCursor(0, 1);
    lcd.print ("s");
    settings();

  }

}
void settings() {   // отрисовка нового времени
  butt1.tick();
  butt2.tick();

  if (mode == 1) {
    if (!newTimeFlag) newTimeFlag = true;
    switch (znach) {   //устанавливаем время
      case 0:   if (butt1.isClick() || butt1.isStep()) {  //минуты и часы если вышли за пределы минут
          lcd.setCursor(4, 1);
          lcd.blink();
          mins ++;
          if (mins > 59) {
            mins = 0;
            hrs ++;
            if (hrs > 23) hrs = 0;
          }
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          mins --;
          if (mins < 0) {
            mins = 59;
            hrs --;
            if (hrs < 0) hrs = 23;
          }
        }
      case 1: if (butt1.isClick() || butt1.isStep()) {  //только часы
          hrs ++;
          if (hrs > 23) hrs = 0;
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          hrs --;
          if (hrs < 0) hrs = 23;
        }
      case 2: if (butt1.isClick() || butt1.isStep())    ddd ++;  //дни
        if (ddd > 31) ddd = 0;
        if (butt2.isClick()/* || butt2.isStep()*/ )     ddd --;
        if (ddd < 0) ddd = 31;
      case 3: if (butt1.isClick() || butt1.isStep())    mmm ++;  // месяцы и год если вышли за передлы месяцев
        if (mmm > 12) {
          mmm = 1;
          yyy ++;
        }
        if (butt2.isClick()/* || butt2.isStep()*/ )     mmm --;
        if (mmm < 1) {
          mmm = 12;
          yyy --;
        }
        break;
    }//switch
    lcd.setCursor(1, 1);   //рисуем изменения на экране кроме недель, они привязаны к году и дате в общем
    if (hrs < 10) {
      lcd.print("0");
      lcd.print(hrs);
    }
    else if (hrs >= 10) lcd.print(hrs);

    lcd.print(":");
    if (mins < 10) {
      lcd.print("0");
      lcd.print(mins);
    }
    else if (mins >= 10) lcd.print(mins);
    lcd.setCursor(13, 1);
    if (ddd < 10) {
      lcd.print("0");
      lcd.print(ddd, DEC);
    }
    else if (ddd >= 10) lcd.print(ddd, DEC);
    lcd.print ("/");
    if (mmm < 10) {
      lcd.print("0");
      lcd.print(mmm, DEC);
    }
    else if (mmm >= 10) lcd.print(mmm, DEC);
    lcd.setCursor(10, 2);    //выводим год, чтобы точно знать что значение недели совпадут с реальными
    lcd.print(yyy);

    if (millis() - zad > 30000) { //если прошло 30 сек возвращать в мод 0 и установить новое время
      zad = millis();
      newTimeFlag = false;
      rtc.adjust(DateTime(yyy, mmm, ddd, hrs,  mins, 0)); // пропимывается только дата если в лууп есть какие-то данные связ с ртс
      lcd.clear();
      mode = 0;
    }
  } //mode 1
} //settin

void func_time() {    //отрисовуем время на экране во время простоя
  DateTime now = rtc.now();
  newTimeFlag = false;
  lcd.setCursor(1, 1);
  if (now.hour() < 10) {
    lcd.print("0");
    lcd.print(now.hour());
  }
  else if (now.hour() >= 10) {
    lcd.print(now.hour());
  }
  lcd.print(":");
  if (now.minute() < 10) {
    lcd.print("0");
    lcd.print(now.minute());
  }
  else if (now.minute() >= 10) {
    lcd.print(now.minute());
  }

  lcd.setCursor(9, 1);
  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);   //значение меняется автоматически при установке новой даты

  lcd.setCursor(13, 1);
  if (now.day() < 10) {
    lcd.print("0");
    lcd.print( now.day(), DEC);
  }
  else if (now.day() >= 10) {
    lcd.print( now.day(), DEC);
  }
  lcd.print ("/");
  if (now.month() < 10) {
    lcd.print("0");
    lcd.print( now.month(), DEC);
  }
  else if (now.month() >= 10) {
    lcd.print( now.month(), DEC);
  }
}

 

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

nik182 пишет:
Для общения по интересам. Ваши вопросы много раз обсасывались на форуме. Вон Пух привел несколько ссылок. Они по новой уже не интересны. Поищите. Есть ответы на все Ваши вопросы. Вам лень искать, нам лень в который раз писать одно и тоже. А для остального есть гугль и вики.

пух то дал ссылки, и я честно ходил и смотрел туда, и честно пытался понять как то что там есть можно использовать для себя. для меня это все темный лес и очень сложно, я фотошоп, а не программист (шутка) на самом деле это первый опыт в программировании 

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

DetSimen пишет:

Valerich-tex пишет:

Зачем существует форум?

Дай угадаю. 

С точки зрения не умеющих читать и забаненых в гугале : Для растолковывания не хотящим учица идиотам неких прописных истин примерно в стопицотый раз. 

А разве не на вопросах мы учимся?  Скорее это взгляд со стороны здрота, ведь когда много знаешь и видишь банальные вопросы все кажется таким простым и не хочется ничего объяснять. 

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

ну и применил все сделанное ранее к тому что задумывал изначально. теперь код занимает 98% памяти, идет отработка по всем параметрам.  так что все таки если долго мучатся много смотреть читать спрашивать то что-то обязательно получится 

#include <Wire.h>
#include <SPI.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
//DateTime now;                     // datetime считывает время с модуля и выводит на команды

//#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;

#include <GyverButton.h>
GButton butt2(10);
GButton butt1(5);

#define mode_see 1
#define mode_set

unsigned long last_time;         //потому что значение от -4000к до +4000К
unsigned long zad, times;
bool mode = 0; //0-показ времени, 1-настройка времени
boolean blinkFlag, newTimeFlag;
int mins, hrs, ddd, mmm, yyy;
int znach;
char weeek;

void setup() {

  lcd.init();
  lcd.backlight();
  lcd.clear();
  bool status;
  status = bme.begin();
  //rtc.begin();
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  //команда для прошивки времени, не забыть отключить ее на финальной прошивке

  DateTime now = rtc.now();
  mins = now.minute();
  hrs = now.hour();
  //weeek = daysOfTheWeek[now.dayOfTheWeek()];
  ddd = now.day();
  mmm = now.month();
  yyy = now.year();
}

void loop() {
  //now = rtc.now();           // datetime считывает время с модуля и выводит на команды
  butt1.tick();              //обязательная команда опрос кнопки
  butt2.tick();              //опрос 2й кнопки
  lcd.setCursor(0, 0);
  lcd.print("JEEP GRAND CHEROKEE");
  lcd.setCursor(0, 1);
  lcd.print("ZJ ");

  if (butt1.isHolded()/* && butt2.isHolded()*/) { //переход в режим установки времени
    mode ++;
    if (mode > 1) mode = 0;
  }
  if (butt2.isHolded()) {  //переход на новый устанавливаемый параметр
    znach ++;
    if (znach > 3) znach = 0;
  }
  if (mode == 0) {
    func_time();
  }
  if (mode == 1) {
    lcd.setCursor(7, 1);
    lcd.print ("s");
    settings();
  }

  if (millis() - last_time > 1000) {
    last_time = millis();
    printValues();
  }
}
void printValues() {

  lcd.setCursor(0, 2);
  lcd.print(" ");
  lcd.print(round(bme.readTemperature()));
  lcd.print("C|");
  lcd.print(round(rtc.getTemperature()));
  lcd.println("C     ");

  lcd.setCursor(10, 2);
  lcd.print("   ");
  lcd.print(round(bme.readPressure() / 100.0F * 0.750062F));
  lcd.println("mm  ");

  lcd.setCursor(0, 3);
  lcd.print("  ");
  lcd.print(round(bme.readAltitude(SEALEVELPRESSURE_HPA)));
  lcd.print("m   ");

  lcd.setCursor(10, 3);
  lcd.print("   ");
  lcd.print(round(bme.readHumidity()));
  lcd.println("%    ");
}
void settings() {   // отрисовка нового времени
  butt1.tick();
  butt2.tick();

  if (mode == 1) {
    if (!newTimeFlag) newTimeFlag = true;
    switch (znach) {   //устанавливаем время
      case 0:   if (butt1.isClick() || butt1.isStep()) {  //минуты и часы если вышли за пределы минут
          lcd.setCursor(4, 1);
          lcd.blink();
          mins ++;
          if (mins > 59) {
            mins = 0;
            hrs ++;
            if (hrs > 23) hrs = 0;
          }
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          mins --;
          if (mins < 0) {
            mins = 59;
            hrs --;
            if (hrs < 0) hrs = 23;
          }
        }
      case 1: if (butt1.isClick() || butt1.isStep()) {  //только часы
          hrs ++;
          if (hrs > 23) hrs = 0;
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          hrs --;
          if (hrs < 0) hrs = 23;
        }
      case 2: if (butt1.isClick() || butt1.isStep())    ddd ++;  //дни
        if (ddd > 31) ddd = 0;
        if (butt2.isClick()/* || butt2.isStep()*/ )     ddd --;
        if (ddd < 0) ddd = 31;
      case 3: if (butt1.isClick() || butt1.isStep())    mmm ++;  // месяцы и год если вышли за передлы месяцев
        if (mmm > 12) {
          mmm = 1;
          yyy ++;
        }
        if (butt2.isClick()/* || butt2.isStep()*/ )     mmm --;
        if (mmm < 1) {
          mmm = 12;
          yyy --;
        }
        break;
    }//switch
    lcd.setCursor(2, 1);   //рисуем изменения на экране кроме недель, они привязаны к году и дате в общем
    if (hrs < 10) {
      lcd.print("0");
      lcd.print(hrs);
    }
    else if (hrs >= 10) lcd.print(hrs);

    lcd.print(":");
    if (mins < 10) {
      lcd.print("0");
      lcd.print(mins);
    }
    else if (mins >= 10) lcd.print(mins);
    lcd.setCursor(13, 1);
    if (ddd < 10) {
      lcd.print("0");
      lcd.print(ddd, DEC);
    }
    else if (ddd >= 10) lcd.print(ddd, DEC);
    lcd.print ("/");
    if (mmm < 10) {
      lcd.print("0");
      lcd.print(mmm, DEC);
    }
    else if (mmm >= 10) lcd.print(mmm, DEC);
    lcd.setCursor(8, 2);    //выводим год, чтобы точно знать что значение недели совпадут с реальными
    lcd.print(yyy);

    if (millis() - zad > 30000) { //если прошло 30 сек возвращать в мод 0 и установить новое время
      zad = millis();
      newTimeFlag = false;
      rtc.adjust(DateTime(yyy, mmm, ddd, hrs,  mins, 0)); // пропимывается только дата если в лууп есть какие-то данные связ с ртс
      lcd.clear();
      mode = 0;
    }
  } //mode 1
} //settin

void func_time() {    //отрисовуем время на экране во время простоя
  DateTime now = rtc.now();
  newTimeFlag = false;
  lcd.setCursor(2, 1);
  if (now.hour() < 10) {
    lcd.print("0");
    lcd.print(now.hour());
  }
  else if (now.hour() >= 10) {
    lcd.print(now.hour());
  }
  lcd.print(":");
  if (now.minute() < 10) {
    lcd.print("0");
    lcd.print(now.minute());
  }
  else if (now.minute() >= 10) {
    lcd.print(now.minute());
  }

  lcd.setCursor(9, 1);
  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);   //значение меняется автоматически при установке новой даты

  lcd.setCursor(13, 1);
  if (now.day() < 10) {
    lcd.print("0");
    lcd.print( now.day(), DEC);
  }
  else if (now.day() >= 10) {
    lcd.print( now.day(), DEC);
  }
  lcd.print ("/");
  if (now.month() < 10) {
    lcd.print("0");
    lcd.print( now.month(), DEC);
  }
  else if (now.month() >= 10) {
    lcd.print( now.month(), DEC);
  }
}

 

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

Основная ваша ошибка это кнопки. Очень неудобно менять обработчик нажатия кнопки для организации меню. И пока вы к этому не придете, то жевать эту подошву вы будете очень долго.

//------- кнопки ---------------------------
typedef void (*pDo)();
class Cl_Btn {
  protected:
    byte pin;
    bool state;
    unsigned long past;
    void set(bool s) {
      state = s;
      past = millis();
      if (s) Do();
    }
  public:
    Cl_Btn(byte p): pin(p) {}
    pDo Do = [] {};
    void init() {
      pinMode(pin, INPUT_PULLUP);
      set(false);
    }
    void run() {
      if (millis() - past >= 100)
        switch (state) {
          case false:
            if (!digitalRead(pin))set(true);
            break;
          case true:
            if (digitalRead(pin))set(false);
            //if (millis() - past >= 300)set(false);
            break;
        }
    }
};
Cl_Btn BtnS(/*пин*/2);
//---------------------------------------
void setup() {
  Serial.begin(9600);
  BtnS.init();
  BtnS.Do = [] {Serial.println("Tuc");};
}

void loop() {
  BtnS.run();
}

 

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

Если Вы такой поклонник Гайверовских библиотек, то почему не написать так 

/**/
typedef void (*pDo)();
#include <GyverButton.h>
//github.com/AlexGyver/GyverLibs/blob/master/GyverButton/GyverButton.h
GButton butt1(/*пин*/2);
pDo Do_butt1_Click = [] {};
void init_menu(){}
void run_menu(){}
//--------------------------------------
void setup() {
  Serial.begin(9600);
  Do_butt1_Click = [] {Serial.println("Tuc");};
  init_menu();
}
void loop() {
  butt1.tick();
  if (butt1.isClick()) Do_butt1_Click();
  run_menu();
}

ПС: И не надо всяких сюда новичок, фотошопер. Вы это перед самой ардуиной порассказывайте.

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

qwone пишет:

Если Вы такой поклонник Гайверовских библиотек, то почему не написать так 

мне этот вариант показался удобнее в использовании, 

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

qwone пишет:

ПС: И не надо всяких сюда новичок, фотошопер. Вы это перед самой ардуиной порассказывайте.

Ну так я и пробую разное, дуинка матюкается и я пробую по другому, и так пока где-то что-то не вычитаю и еще раз не попробую, результат-то идет.  

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

Valerich-tex пишет:
мне этот вариант показался удобнее в использовании, 

А вот мне как пользователю не очень. В библиотеке организовано распознование одиночных и двойных кликов. Что привело к тому что кликаю а эффекта нет. Видно периодически между кликами возникаю дважды-клики. А теперь наложим Ваше управление с помощью двух кнопок, то сделать круг надо 60 раз постучать на кнопку.   В общем это издевательство на потребителем Вашей программы.

ПС:а вот простейшая простая программа меню , которая должна быть понятна каждому новичку. А другие Варианты это просто очень громоздкие и сложно контролируемые при отладке программы.

/**/
typedef void (*pDo)();
#include <GyverButton.h>
//github.com/AlexGyver/GyverLibs/blob/master/GyverButton/GyverButton.h
GButton butt1(/*пин*/8);
pDo Do_butt1_Click = [] {};
const byte page0 = 0;//главный экран
const byte page1 = 10;// 1-я страница
const byte page2 = 20;// 2-я страница
const byte page3 = 30;// 3-я страница
byte page;
void goPage(byte p) {
  page = p;
  switch (page) {
    case page0:
      {
        Serial.println("page0");
      }
      Do_butt1_Click = [] {goPage(page1);};
      break;
    case page1:
      {
        Serial.println("page1");
      }
      Do_butt1_Click = [] {goPage(page2);};
      break;
    case page2:
      {
        Serial.println("page2");
      }
      Do_butt1_Click = [] {goPage(page3);};
      break;
    case page3:
      {
        Serial.println("page3");
      }
      Do_butt1_Click = [] {goPage(page0);};
      break;
  }
}
void init_menu() {
  goPage(page0);
}
void run_menu() {}
//--------------------------------------
void setup() {
  Serial.begin(9600);
  init_menu();
}
void loop() {
  butt1.tick();
  if (butt1.isClick()) Do_butt1_Click();
  run_menu();
}

И да все похоже на те ссылки которые привел выше.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Valerich-tex пишет:

DetSimen пишет:

Дай угадаю. 

С точки зрения не умеющих читать и забаненых в гугале : Для растолковывания не хотящим учица идиотам неких прописных истин примерно в стопицотый раз. 

А разве не на вопросах мы учимся?  Скорее это взгляд со стороны здрота, ведь когда много знаешь и видишь банальные вопросы все кажется таким простым и не хочется ничего объяснять. 

Учимся мы в учебных заведениях.

Или самостоятельно - по учебникам.

Но форум - не замена учебному заведению. Особенно для людей, принципиально не желающих читать учебники.

И - да, не хочется повторять объяснения, которые уже сто раз были размещены на данном форуме, а в И-нете количество дублей этих объяснений идет уже на тысячи. С какой стати я должен в сотый раз писать одно и то же для человека, которому лень воспользоваться поиском?

 

PS. Кстати, попытайтесь на данном форуме осуществить поиск по фразе "для чего нужен форум".

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

И так, я уже залил ранее весь код, все работает, но часики маленькие да и лишний текст на экране не прикольно, так вот я подумал и утром накидал такой код, забиваю верхние 2 строки большими часами и датой, а нижние 2 строки оставляю под данные с bme и сейчас стоит вопрос с весе сего кода, он выходит на 14866, при памяти контроллера 14336. естественно сейчас ничего не идет, какую из библиотек можно подрезать по размеру и как это делается. 

#include <Wire.h>
#include <SPI.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

//github.com/adafruit/RTClib
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

//#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;

//github.com/AlexGyver/GyverLibs/blob/master/GyverButton/GyverButton.h
#include <GyverButton.h>
GButton butt2(10);
GButton butt1(5);

unsigned long last_time, zad, times;         //потому что значение от -4000к до +4000К
bool mode = 0; //0-показ времени, 1-настройка времени
boolean blinkFlag, newTimeFlag;
int mins, hrs, ddd, mmm, yyy;
int znach;

byte LT[8]    = {  B00111,  B01111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
byte UB[8]    = {  B11111,  B11111,  B11111,  B00000,  B00000,  B00000,  B00000,  B00000 };
byte RT[8]    = {  B11100,  B11110,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
byte LL[8]    = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B01111,  B00111 };
byte LB[8]    = {  B00000,  B00000,  B00000,  B00000,  B00000,  B11111,  B11111,  B11111 };
byte LR[8]    = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11110,  B11100 };
byte MB[8]    = {  B11111,  B11111,  B11111,  B00000,  B00000,  B00000,  B11111,  B11111 };
byte block[8] = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
int count = 0;

void setup() {

  lcd.init();
  lcd.backlight();
  lcd.clear();
  bool status;
  status = bme.begin();
  //rtc.begin();
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  //команда для прошивки времени, не забыть отключить ее на финальной прошивке

  DateTime now = rtc.now();
  mins = now.minute();
  hrs = now.hour();
  //weeek = daysOfTheWeek[now.dayOfTheWeek()];
  ddd = now.day();
  mmm = now.month();
  yyy = now.year();

  lcd.createChar(0, LT);
  lcd.createChar(1, UB);
  lcd.createChar(2, RT);
  lcd.createChar(3, LL);
  lcd.createChar(4, LB);
  lcd.createChar(5, LR);
  lcd.createChar(6, MB);
  lcd.createChar(7, block);
}

void loop() {
  butt1.tick();              //обязательная команда опрос кнопки
  butt2.tick();              //опрос 2й кнопки

  if (butt1.isHolded()/* && butt2.isHolded()*/) { //переход в режим установки времени
    mode ++;
    if (mode > 1) mode = 0;
  }
  if (butt2.isHolded()) {  //переход на новый устанавливаемый параметр
    znach ++;
    if (znach > 3) znach = 0;
  }
  if (mode == 0) {
    func_time();
  }
  if (mode == 1) {
    lcd.setCursor(7, 1);
    lcd.print ("s");
    settings();
  }

  if (millis() - last_time > 1000) {
    last_time = millis();
    printValues();
  }
}
void printValues() {

  lcd.setCursor(1, 2);
  lcd.print(round(bme.readTemperature()));
  lcd.print("C || ");
  lcd.setCursor(18, 1);
  lcd.print(round(rtc.getTemperature()));
  lcd.println("C");

  lcd.setCursor(10, 2);
  lcd.print("   ");
  lcd.print(round(bme.readPressure() / 100.0F * 0.750062F));
  lcd.println("mm  ");

  lcd.setCursor(0, 3);
  lcd.print("  ");
  lcd.print(round(bme.readAltitude(SEALEVELPRESSURE_HPA)));
  lcd.print("m   ");

  lcd.setCursor(10, 3);
  lcd.print(" ~~");
  lcd.print(round(bme.readHumidity()));
  lcd.println("%~~    ");
}
void settings() {   // отрисовка нового времени
  butt1.tick();
  butt2.tick();

  if (mode == 1) {
    if (!newTimeFlag) newTimeFlag = true;
    switch (znach) {   //устанавливаем время
      case 0:   if (butt1.isClick() || butt1.isStep()) {  //минуты и часы если вышли за пределы минут
          mins ++;
          if (mins > 59) {
            mins = 0;
            hrs ++;
            if (hrs > 23) hrs = 0;
          }
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          mins --;
          if (mins < 0) {
            mins = 59;
            hrs --;
            if (hrs < 0) hrs = 23;
          }
        }
      case 1: if (butt1.isClick() || butt1.isStep()) {  //только часы
          hrs ++;
          if (hrs > 23) hrs = 0;
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          hrs --;
          if (hrs < 0) hrs = 23;
        }
      case 2: if (butt1.isClick() || butt1.isStep())    ddd ++;  //дни
        if (ddd > 31) ddd = 0;
        if (butt2.isClick()/* || butt2.isStep()*/ )     ddd --;
        if (ddd < 0) ddd = 31;
      case 3: if (butt1.isClick() || butt1.isStep())    mmm ++;  // месяцы и год если вышли за передлы месяцев
        if (mmm > 12) {
          mmm = 1;
          yyy ++;
        }
        if (butt2.isClick()/* || butt2.isStep()*/ )     mmm --;
        if (mmm < 1) {
          mmm = 12;
          yyy --;
        }
        break;
    }//switch
    printDigits(hrs / 10, 0);
    printDigits(hrs % 10, 4);

    printDigits(mins / 10, 9);
    printDigits(mins % 10, 13);
    lcd.setCursor(15, 1);  //дни недели сидят в дате и меняются вместе сней
    if (ddd < 10) {
      lcd.print("0");
      lcd.print(ddd, DEC);
    }
    else if (ddd >= 10) lcd.print(ddd, DEC);
    lcd.print ("/");
    if (mmm < 10) {
      lcd.print("0");
      lcd.print(mmm, DEC);
    }
    else if (mmm >= 10) lcd.print(mmm, DEC);
    lcd.setCursor(15, 0);    //выводим год, чтобы точно знать что значение недели совпадут с реальными
    lcd.print(yyy);

    if (millis() - zad > 30000) { //если прошло 30 сек возвращать в мод 0 и установить новое время
      zad = millis();
      newTimeFlag = false;
      rtc.adjust(DateTime(yyy, mmm, ddd, hrs,  mins, 0)); //установка нового времени 
      lcd.clear();
      mode = 0;
      znach = 0; //чтобы сбрасывалось на минуты всегда 
    }
  } //mode 1
} 

void func_time() {    //отрисовуем время на экране во время простоя
  DateTime now = rtc.now();
  newTimeFlag = false;
  printDigits(now.hour() / 10, 0);
  printDigits(now.hour() % 10, 4);

  printDigits(now.minute() / 10, 8);
  printDigits(now.minute() % 10, 12);

  lcd.setCursor(16, 0);
  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);   //значение меняется автоматически при установке новой даты

  lcd.setCursor(15, 1);
  if (now.day() < 10) {
    lcd.print("0");
    lcd.print( now.day(), DEC);
  }
  else if (now.day() >= 10) {
    lcd.print( now.day(), DEC);
  }
  lcd.print ("/");
  if (now.month() < 10) {
    lcd.print("0");
    lcd.print( now.month(), DEC);
  }
  else if (now.month() >= 10) {
    lcd.print( now.month(), DEC);
  }
}
void custom0(int x)
{ // uses segments to build the number 0

  lcd.setCursor(x, 0); // set cursor to column 0, line 0 (first row)
  lcd.write(0);  // call each segment to create
  lcd.write(1);  // top half of the number
  lcd.write(2);
  lcd.setCursor(x, 1); // set cursor to colum 0, line 1 (second row)
  lcd.write(3);  // call each segment to create
  lcd.write(4);  // bottom half of the number
  lcd.write(5);
}

void custom1(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(1);
  lcd.write(2);
  lcd.print(" ");
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(7);
  lcd.write(4);
}

void custom2(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(4);
}

void custom3(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom4(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(3);
  lcd.write(4);
  lcd.write(7);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);
}

void custom5(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(3);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom6(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom7(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);
}

void custom8(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom9(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);

}
void printDigits(int digits, int x) {
  // utility function for digital clock display: prints preceding colon and leading 0

  switch (digits) {
    case 0:
      custom0(x);
      break;
    case 1:
      custom1(x);
      break;
    case 2:
      custom2(x);
      break;
    case 3:
      custom3(x);
      break;
    case 4:
      custom4(x);
      break;
    case 5:
      custom5(x);
      break;
    case 6:
      custom6(x);
      break;
    case 7:
      custom7(x);
      break;
    case 8:
      custom8(x);
      break;
    case 9:
      custom9(x);
      break;
  }
}

Библиотека кнопок не хотелось бы убирать(удобная), а код часов проверил в отдельном окне, дальше только соединил все аккуратно. хотя конечно поменять дуинку(АТ168) проще чем прилить библиотеки, но я думаю рассмотреть разные варианты 

#include <Wire.h>
#include <SPI.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include <RTClib.h>
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
//DateTime now // datetime считывает время с модуля и выводит на команды


#include <GyverButton.h>
GButton butt2(10);
GButton butt1(5);


unsigned long zad;
bool mode = 0; //0-показ времени, 1-настройка времени
boolean blinkFlag, newTimeFlag;
int mins, hrs, ddd, mmm, yyy;
int znach;
char weeek;

byte LT[8]    = {  B00111,  B01111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
byte UB[8]    = {  B11111,  B11111,  B11111,  B00000,  B00000,  B00000,  B00000,  B00000 };
byte RT[8]    = {  B11100,  B11110,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
byte LL[8]    = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B01111,  B00111 };
byte LB[8]    = {  B00000,  B00000,  B00000,  B00000,  B00000,  B11111,  B11111,  B11111 };
byte LR[8]    = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11110,  B11100 };
byte MB[8]    = {  B11111,  B11111,  B11111,  B00000,  B00000,  B00000,  B11111,  B11111 };
byte block[8] = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
int count = 0;

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  rtc.begin();
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  //команда для прошивки времени, не забыть отключить ее на финальной прошивке

  DateTime now = rtc.now();
  mins = now.minute();
  hrs = now.hour();
  //weeek = daysOfTheWeek[now.dayOfTheWeek()];
  ddd = now.day();
  mmm = now.month();
  yyy = now.year();

  lcd.createChar(0, LT);
  lcd.createChar(1, UB);
  lcd.createChar(2, RT);
  lcd.createChar(3, LL);
  lcd.createChar(4, LB);
  lcd.createChar(5, LR);
  lcd.createChar(6, MB);
  lcd.createChar(7, block);
}
void loop() {
  butt1.tick();
  butt2.tick();

  if (butt1.isHolded()/* && butt2.isHolded()*/) { //переход в режим установки времени
    mode ++;
    if (mode > 1) mode = 0;
  }
  if (butt2.isHolded()) {  //переход на новый устанавливаемый параметр
    znach ++;
    if (znach > 3) znach = 0;
  }
  if (mode == 0) {
    func_time();
  }

  if (mode == 1) {
    lcd.setCursor(7, 1);
    lcd.print ("s");
    settings();

  }

}
void settings() {   // отрисовка нового времени
  butt1.tick();
  butt2.tick();

  if (mode == 1) {
    if (!newTimeFlag) newTimeFlag = true;
    switch (znach) {   //устанавливаем время
      case 0:   if (butt1.isClick() || butt1.isStep()) {  //минуты и часы если вышли за пределы минут
          lcd.setCursor(3, 1);
          lcd.blink();
          lcd.noBlink();
          mins ++;
          if (mins > 59) {
            mins = 0;
            hrs ++;
            if (hrs > 23) hrs = 0;
          }
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          mins --;
          if (mins < 0) {
            mins = 59;
            hrs --;
            if (hrs < 0) hrs = 23;
          }
        }
      case 1: if (butt1.isClick() || butt1.isStep()) {  //только часы
          hrs ++;
          if (hrs > 23) hrs = 0;
        }
        if (butt2.isClick()/* || butt2.isStep()*/) {
          hrs --;
          if (hrs < 0) hrs = 23;
        }
      case 2: if (butt1.isClick() || butt1.isStep())    ddd ++;  //дни
        if (ddd > 31) ddd = 0;
        if (butt2.isClick()/* || butt2.isStep()*/ )     ddd --;
        if (ddd < 0) ddd = 31;
      case 3: if (butt1.isClick() || butt1.isStep())    mmm ++;  // месяцы и год если вышли за передлы месяцев
        if (mmm > 12) {
          mmm = 1;
          yyy ++;
        }
        if (butt2.isClick()/* || butt2.isStep()*/ )     mmm --;
        if (mmm < 1) {
          mmm = 12;
          yyy --;
        }
        break;
    }//switch
    printDigits(hrs / 10, 0);
    printDigits(hrs % 10, 4);

    printDigits(mins / 10, 8);
    printDigits(mins % 10, 12);
    lcd.setCursor(15, 1);
    if (ddd < 10) {
      lcd.print("0");
      lcd.print(ddd, DEC);
    }
    else if (ddd >= 10) lcd.print(ddd, DEC);
    lcd.print ("/");
    if (mmm < 10) {
      lcd.print("0");
      lcd.print(mmm, DEC);
    }
    else if (mmm >= 10) lcd.print(mmm, DEC);
    lcd.setCursor(15, 0);    //выводим год, чтобы точно знать что значение недели совпадут с реальными
    lcd.print(yyy);

    if (millis() - zad > 30000) { //если прошло 30 сек возвращать в мод 0 и установить новое время
      zad = millis();
      newTimeFlag = false; 
      rtc.adjust(DateTime(yyy, mmm, ddd, hrs,  mins, 0)); // пропимывается только дата если в лууп есть какие-то данные связ с ртс
      lcd.clear();
      mode = 0;  //выход из настройки 
      znach = 0; //уходить в настройку минут 
    }
  } //mode 1
} //settin

void func_time() {    //отрисовуем время на экране во время простоя
  DateTime now = rtc.now();
  newTimeFlag = false;

  printDigits(now.hour() / 10, 0);
  printDigits(now.hour() % 10, 4);

  printDigits(now.minute() / 10, 8);
  printDigits(now.minute() % 10, 12);

  if (now.second() % 10 % 2 == 0) {
    lcd.setCursor(7, 0);
    lcd.print("+");
    lcd.setCursor(7, 1);
    lcd.print(" ");
  }
  else
  {
    lcd.setCursor(7, 0);
    lcd.print(" ");
    lcd.setCursor(7, 1);
    lcd.print("+");
  }
  lcd.setCursor(16, 0);
  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);   //значение меняется автоматически при установке новой даты

  lcd.setCursor(15, 1);
  if (now.day() < 10) {
    lcd.print("0");
    lcd.print( now.day(), DEC);
  }
  else if (now.day() >= 10) {
    lcd.print( now.day(), DEC);
  }
  lcd.print ("/");
  if (now.month() < 10) {
    lcd.print("0");
    lcd.print( now.month(), DEC);
  }
  else if (now.month() >= 10) {
    lcd.print( now.month(), DEC);
  }
}
void custom0(int x)
{ // uses segments to build the number 0

  lcd.setCursor(x, 0); // set cursor to column 0, line 0 (first row)
  lcd.write(0);  // call each segment to create
  lcd.write(1);  // top half of the number
  lcd.write(2);
  lcd.setCursor(x, 1); // set cursor to colum 0, line 1 (second row)
  lcd.write(3);  // call each segment to create
  lcd.write(4);  // bottom half of the number
  lcd.write(5);
}

void custom1(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(1);
  lcd.write(2);
  lcd.print(" ");
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(7);
  lcd.write(4);
}

void custom2(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(4);
}

void custom3(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom4(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(3);
  lcd.write(4);
  lcd.write(7);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);
}

void custom5(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(3);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom6(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom7(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);
}

void custom8(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom9(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);

}
void printDigits(int digits, int x) {
  // utility function for digital clock display: prints preceding colon and leading 0

  switch (digits) {
    case 0:
      custom0(x);
      break;
    case 1:
      custom1(x);
      break;
    case 2:
      custom2(x);
      break;
    case 3:
      custom3(x);
      break;
    case 4:
      custom4(x);
      break;
    case 5:
      custom5(x);
      break;
    case 6:
      custom6(x);
      break;
    case 7:
      custom7(x);
      break;
    case 8:
      custom8(x);
      break;
    case 9:
      custom9(x);
      break;
  }
}

 

 

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

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

Valerich-tex
Offline
Зарегистрирован: 10.08.2019

b707 пишет:
Если выкинуть бутлоадер, памяти будет 16384 байта и все войдет

хорошая идея) только мне загрузить будет нечем если это сделать.  + я чуть порылся в коде и удалось ужать его до 14496 больше у меня не вышло, дальше только отключил дни недели и осталось 14320 и так все заработало. хочется конечно чтобы и дни были,хотя это не такая актуальная информация. Как видно на картинке между первыми 2 цифрами присутствует артефакт не понятно от куда взявшийся, потому что этот же код, но без датчика bme работает четко и без каких либо артефактов. где сидит проблема? 

если в строке 351 и 352 убрать комментарии то идет без артефактов 

#include <Wire.h>
#include <SPI.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

//github.com/adafruit/RTClib
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

//#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;

//github.com/AlexGyver/GyverLibs/blob/master/GyverButton/GyverButton.h
#include <GyverButton.h>
GButton butt2(10);
GButton butt1(5);

unsigned long last_time, zad, times;         //потому что значение от -4000к до +4000К
bool mode = 0; //0-показ времени, 1-настройка времени
boolean blinkFlag, newTimeFlag;
byte mins, hrs, ddd, mmm, znach;
int yyy;

byte LT[8]    = {  B00111,  B01111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
byte UB[8]    = {  B11111,  B11111,  B11111,  B00000,  B00000,  B00000,  B00000,  B00000 };
byte RT[8]    = {  B11100,  B11110,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
byte LL[8]    = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B01111,  B00111 };
byte LB[8]    = {  B00000,  B00000,  B00000,  B00000,  B00000,  B11111,  B11111,  B11111 };
byte LR[8]    = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11110,  B11100 };
byte MB[8]    = {  B11111,  B11111,  B11111,  B00000,  B00000,  B00000,  B11111,  B11111 };
byte block[8] = {  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111,  B11111 };
int count = 0;

void printValues() {

  lcd.setCursor(0, 2);
  lcd.print(" ");
  lcd.print(round(bme.readTemperature()));
  lcd.print("C||");
  lcd.print(round(rtc.getTemperature()));
  lcd.println("C  ");

  lcd.setCursor(7, 3);
  lcd.print(" ");
  lcd.print(round(bme.readPressure() / 100.0F * 0.750062F));
  lcd.println("mm ");

  lcd.setCursor(0, 3);
  lcd.print(" ");
  lcd.print(round(bme.readAltitude(SEALEVELPRESSURE_HPA)));
  lcd.print("m ");

  lcd.setCursor(13, 3);
  lcd.print("   ");
  lcd.print(round(bme.readHumidity()));
  lcd.println("%    ");
}
void settings() {   // отрисовка нового времени
  //butt1.tick();
  //butt2.tick();

  if (mode == 1) {
    if (!newTimeFlag) newTimeFlag = true;
    switch (znach) {   //выбираем устанавливаемый параметр 
      case 0:   if (butt1.isClick() || butt1.isStep())  mins ++;   //минуты и часы если вышли за пределы минут
        if (mins > 59) {
          mins = 0;
          hrs ++;
          if (hrs > 23) hrs = 0;
        }
        if (butt2.isClick()/* || butt2.isStep()*/)      mins --;
        if (mins < 0) {
          mins = 59;
          hrs --;
          if (hrs < 0) hrs = 23;
        }
      case 1: if (butt1.isClick() || butt1.isStep())    hrs ++;    //только часы
        if (hrs > 23) hrs = 0;

        if (butt2.isClick()/* || butt2.isStep()*/)      hrs --;
        if (hrs < 0) hrs = 23;

      case 2: if (butt1.isClick() || butt1.isStep())    ddd ++;  //дни
        if (ddd > 31) ddd = 0;
        if (butt2.isClick()/* || butt2.isStep()*/ )     ddd --;
        if (ddd < 0) ddd = 31;
      case 3: if (butt1.isClick() || butt1.isStep())    mmm ++;  // месяцы и год если вышли за передлы месяцев
        if (mmm > 12) {
          mmm = 1;
          yyy ++;
        }
        if (butt2.isClick()/* || butt2.isStep()*/ )     mmm --;
        if (mmm < 1) {
          mmm = 12;
          yyy --;
        }
        break;
    }//switch
    printDigits(hrs / 10, 0);
    printDigits(hrs % 10, 4);

    printDigits(mins / 10, 8);
    printDigits(mins % 10, 12);
    lcd.setCursor(15, 1);  //дни недели сидят в дате и меняются вместе сней
    if (ddd < 10) lcd.print("0");
    lcd.print(ddd);
    lcd.print ("/");
    if (mmm < 10)  lcd.print("0");
    lcd.print(mmm);

    lcd.setCursor(15, 0);    //выводим год, чтобы точно знать что значение недели совпадут с реальными
    lcd.print(yyy);

    if (millis() - zad > 30000) { //если прошло 30 сек возвращать в мод 0 и установить новое время
      zad = millis();
      newTimeFlag = false;
      rtc.adjust(DateTime(yyy, mmm, ddd, hrs,  mins, 0)); //установка нового времени
      lcd.clear();
      mode = 0;
      znach = 0; //чтобы сбрасывалось на минуты всегда
    }
  } //mode 1
}

void func_time() {    //отрисовуем время на экране во время простоя
  DateTime now = rtc.now();
  //newTimeFlag = false;
  printDigits(now.hour() / 10, 0);
  printDigits(now.hour() % 10, 4);

  printDigits(now.minute() / 10, 8);
  printDigits(now.minute() % 10, 12);

  if (now.second() % 10 % 2 == 0) {
    lcd.setCursor(7, 0);
    lcd.print("+");
    lcd.setCursor(7, 1);
    lcd.print(" ");
  }
  else
  {
    lcd.setCursor(7, 0);
    lcd.print(" ");
    lcd.setCursor(7, 1);
    lcd.print("+");
  }

  //  lcd.setCursor(16, 0);
  //  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);   //значение меняется автоматически при установке новой даты

  lcd.setCursor(15, 1);
  if (now.day() < 10) lcd.print("0");
  lcd.print( now.day());
  lcd.print ("/");
  if (now.month() < 10) lcd.print("0");
  lcd.print( now.month());
}
void custom0(int x)
{ // uses segments to build the number 0

  lcd.setCursor(x, 0); // set cursor to column 0, line 0 (first row)
  lcd.write(0);  // call each segment to create
  lcd.write(1);  // top half of the number
  lcd.write(2);
  lcd.setCursor(x, 1); // set cursor to colum 0, line 1 (second row)
  lcd.write(3);  // call each segment to create
  lcd.write(4);  // bottom half of the number
  lcd.write(5);
}

void custom1(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(1);
  lcd.write(2);
  lcd.print(" ");
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(7);
  lcd.write(4);
}

void custom2(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(4);
}

void custom3(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom4(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(3);
  lcd.write(4);
  lcd.write(7);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);
}

void custom5(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(3);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom6(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom7(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);
}

void custom8(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom9(int x)
{
  lcd.setCursor(x, 0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.print(" ");
  lcd.print(" ");
  lcd.write(7);

}
void printDigits(int digits, int x) {
  // использует сегменты для построения числа 0

  switch (digits) {
    case 0:
      custom0(x);
      break;
    case 1:
      custom1(x);
      break;
    case 2:
      custom2(x);
      break;
    case 3:
      custom3(x);
      break;
    case 4:
      custom4(x);
      break;
    case 5:
      custom5(x);
      break;
    case 6:
      custom6(x);
      break;
    case 7:
      custom7(x);
      break;
    case 8:
      custom8(x);
      break;
    case 9:
      custom9(x);
      break;
  }
}
void setup() {

  lcd.init();
  lcd.backlight();
  lcd.clear();
  bool status;
  status = bme.begin();
  //rtc.begin();
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  //команда для прошивки времени, не забыть отключить ее на финальной прошивке

  DateTime now = rtc.now();
  mins = now.minute();
  hrs = now.hour();
  //weeek = daysOfTheWeek[now.dayOfTheWeek()];
  ddd = now.day();
  mmm = now.month();
  yyy = now.year();

  lcd.createChar(0, LT);
  lcd.createChar(1, UB);
  lcd.createChar(2, RT);
  lcd.createChar(3, LL);
  lcd.createChar(4, LB);
  lcd.createChar(5, LR);
  lcd.createChar(6, MB);
  lcd.createChar(7, block);
}

void loop() {
  butt1.tick();              //обязательная команда опрос кнопки
  butt2.tick();              //опрос 2й кнопки
  lcd.setCursor(10, 2);
  lcd.print(" CHEROKEE"); //чтобы забить пустоту
  /*lcd.setCursor(3, 0);
  lcd.print(" ");*/

  if (butt1.isHolded())  mode ++; //переход в режим установки времени
  if (mode > 1) mode = 0;

  if (butt2.isHolded()) znach ++; //переход на новый устанавливаемый параметр
  if (znach > 3) znach = 0;

  if (mode == 0) func_time();
  
  if (mode == 1) {
    lcd.setCursor(7, 1);
    lcd.print ("s");
    settings();
  }

  if (millis() - last_time > 1000) {
    last_time = millis();
    printValues();
  }
}

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

Valerich-tex пишет:

b707 пишет:
Если выкинуть бутлоадер, памяти будет 16384 байта и все войдет

хорошая идея) только мне загрузить будет нечем

загрузить можно любой ардуиной