Прошу помощи в разрешении проблемы с utf8rus [Adafruit_GFX]

bibo
Offline
Зарегистрирован: 26.03.2018

Не могу понять, в чем причина отказа компилироваться. Может вы увидите косяк? Гугл не помог( Ну или я не догнал, какой именно совет из гугла можно взять.

#include <iarduino_Pressure_BMP.h>

#include <Wire.h>
#include "DHT.h"  // подключаем библиотеку для работы с датчиком DHT
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
 #include <iarduino_RTC.h>

#define DHTTYPE DHT11   // DHT 11
#define DHTPIN 2    
// #define pin_SW_SDA 4                                    // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
//  #define pin_SW_SCL 9
//const int buttonPin = 8;     // the number of the pushbutton pin

iarduino_Pressure_BMP sensor;  
iarduino_RTC time(RTC_DS1302, 5, 7, 6);   // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
DHT dht(DHTPIN, DHTTYPE);

int buttonState; 
int wait = 25; // скорость бегущей строки
int spacer = 2;
int width = 5 + spacer; // Регулируем расстояние между символами
int refresh=0;
int pinCS = 10; // Подключение пина CS
int numberOfHorizontalDisplays = 4; // Количество светодиодных матриц по Горизонтали
int numberOfVerticalDisplays = 1; // Количество светодиодных матриц по Вертикали
String weatherString;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);


/*=========================кнопки======================*/



const uint8_t PIN_button_SET  = 4;            // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP   = 3;            // указываем номер вывода arduino, к которому подключена кнопка UP
//const uint8_t PIN_button_DOWN = 5;            // указываем номер вывода arduino, к которому подключена кнопка DOWN
bool     button_state1      = false;          // статус кнопки 1
bool     button_state2      = false;          // статус кнопки 2
bool     button_long_state  = false;          // удержание кнопки (код выполнится один раз)
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;

uint8_t corrClock = 0;                        // корректировали время или нет
uint8_t updCnt = 0;
uint8_t dots = 0;
long dotTime = 0;
long clkTime = 0;

const uint8_t DS18B20 = 8;                    // Указываем, к какому выводу подключена DQ (уличн темп)

uint8_t wibor = 0;                            // После того как длительно нажали на кнопку SET можно будет нажимать коротко
uint8_t mig = 0;
uint8_t migSet = 0;
uint8_t migTime = 0;
long previousMillis = 0;
uint8_t val=0; 

//int updCnt = 0;
//int dots = 0;
//long dotTime = 0;
//long clkTime = 0;
byte del=0;
int h,m,s, hum, temp;
float  pres, pres1;
String mesyc = " ";




/*===================================================================================*/
void setup(void) {
  Serial.begin(9600);
    time.begin();
//time.settime(0,42,11,18,4,18,3);//секунды, минуты,часы,число,месяц,год,день недели


/*=========================кнопки======================*/
pinMode(PIN_button_SET, INPUT_PULLUP);      // кнопки
  pinMode(PIN_button_UP, INPUT_PULLUP);

/*=====================================================*/


 dht.begin();//датчик влажности и температуры
  sensor.begin(); //датчик давления
   
  matrix.setIntensity(0); // Яркость матрицы от 0 до 15
  matrix.setRotation(matrix.getRotation()+2); //1 - 90  2 - 180   3 - 270 угол поворота
// начальные координаты матриц 8*8
  matrix.setRotation(0, 1);        // 1 матрица
  matrix.setRotation(1, 1);        // 2 матрица
  matrix.setRotation(2, 1);        // 3 матрица
  matrix.setRotation(3, 1);        // 4 матрица
}



/*==================================================================================*/
void loop(void) {

  //Serial.println(time.gettime("H:i")); // выводим время
  
 if(updCnt<=0) 
  { // каждые 10 циклов получаем данные времени и погоды
    updCnt = 1;
   time.gettime();
   sensor.read(2);
   String mesyc = " ";
 hum = dht.readHumidity();
 temp = sensor.temperature;
 pres = sensor.pressure/101325;
 pres1 = pres/1.5;
    clkTime = millis();
 }


 
  if(millis()-clkTime > 60000 && !del && dots) { // через каждые 60000 мс запускаем бегущую строку
 ScrollText(utf8rus( mesyc + "влаж.  " + hum + " %    темп. " + temp + " `C " + "давл. " + pres1 + " атм "));
  updCnt--;
  clkTime = millis();
  mig = 0;   
  }

  DisplayTime();
  time.blinktime(migSet);                                         // мигаем устанавливаемым параметром (migSet больше 0) при установке времени
  if(millis()-dotTime > 500) 
  {
    dotTime = millis();
    dots = !dots;
  }
  Func_buttons_control();
}
}





/*================================функция для работы кнопок=============================*/
void Func_buttons_control()
{
   uint32_t ms    = millis();
   bool pin_state1 = digitalRead(PIN_button_SET); // кнопка SET
   bool pin_state2 = digitalRead(PIN_button_UP);  // 2 кнопка
//=========================================================================== кнопка SET
// Фиксируем нажатие кнопки  SET
  if( pin_state1  == LOW && !button_state1 && ( ms - ms_button ) > 50 ){
      button_state1     = true;
      button_long_state = false;
      ms_button         = ms;
      if(wibor == 1)
        switch (mig) 
        {
          case 1:         // кнопка SET выбор мин
            migSet = 2;
            mig = 2;
            break;
          case 2:         // кнопка SET сброс сек на 00
            migSet = 0;                                   // НЕмигают минуты и часы
            mig = 0;
            time.settime(0, -1, -1);                      // Сбросит секунды на 0, а часы, минуты и дату, оставит без изменений.
            wibor = 0;
            break;
        }  
  }
// После 2000 мс нажатия кнопки SET единоразово выполним код
  if( pin_state1  == LOW && !button_long_state && ( ms - ms_button ) > 2000 ) // кнопка SET выбор час
  {
    migSet = 3;
    mig = 1;  
    wibor = 1;                                     // длительно нажали
  }
// Фиксируем отпускание кнопки SET 
   if( pin_state1 == HIGH && button_state1 && ( ms - ms_button ) > 50  ){
      button_state1     = false;   
      ms_button         = ms;
      Serial.println("No Press 2"); //действие после отпуска длительного нажатия
   }   
  //===========================================  Кнопка UP (Установка часов)
  if(mig == 1 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )
  { 
    button_state2     = true;
    ms_button         = ms;
    migSet = 0;
    time.Hours ++;                            // прибавляем единицу к часам
    if (time.Hours > 23) time.Hours = 0;      // если вылезли за границы присваеваем 0
    time.settime(-1, -1, time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  }
  if(mig == 1 && pin_state2  == LOW && ( ms - ms_button ) > 1000 && ( ms - ms_auto_click )>300 ) // После 1000 мс нажатия кнопки каждые 400 мс фиксируем событие нажатия  
  {
    ms_auto_click     = ms;
    migSet = 0;
    time.Hours ++;                            // прибавляем единицу к часам
    if (time.Hours > 23) time.Hours = 0;      // если вылезли за границы присваеваем 0
    time.settime(-1, -1, time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  }
  //===========================================  Кнопка UP (Установка минут)
  if(mig == 2 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )
  { 
    button_state2     = true;
    ms_button         = ms;
    migSet = 0;
    time.minutes ++;                          // прибавляем единицу к минутам
    if (time.minutes > 59) time.minutes = 0;  // если вылезли за границы присваеваем 0
    time.settime(-1, time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  }
  if(mig == 2 && pin_state2  == LOW && ( ms - ms_button ) > 1000 && ( ms - ms_auto_click )>300 ) // После 1000 мс нажатия кнопки каждые 400 мс фиксируем событие нажатия  
  {
    ms_auto_click     = ms;
    migSet = 0;
    time.minutes ++;                          // прибавляем единицу к минутам
    if (time.minutes > 59) time.minutes = 0;  // если вылезли за границы присваеваем 0
    time.settime(-1, time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  }
  //===========================================  Кнопка UP (Установка минут) вызов бегущей строки  
  if(mig == 0 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )
  { 
    mig = 3;
  } 
//==============================================================================  Кнопка UP ( Фиксируем отпускание кнопки установки часов/минут  )
  if(pin_state2 == HIGH && button_state2 && ( ms - ms_button ) > 50  )
  {
    button_state2     = false;   
    ms_button         = ms;
    if(mig == 1){migSet = 3;}
    if(mig == 2){migSet = 2;}
  }
}


/*================================функция для работы кнопок заверешена =============================*/










  /*DisplayTime();
  if(millis()-dotTime > 500) {
    dotTime = millis();
    dots = !dots;
  }
//  buttonState = digitalRead(buttonPin);
  
 //if (buttonState == HIGH) {
       // ScrollText(utf8rus( mesyc + "влаж.  " + hum + " %    темп. " + temp + " `C " + "давл. " + pres1 + " атм " ));
        
  } */
  

  
}

// =======================================================================
/*+++++++++++++

 void DisplayTime(){
  time.gettime();
    h = time.Hours;
 m = time.minutes;

    matrix.fillScreen(LOW);
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали

    
 
if(time.seconds&1 ){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);}
      else  {matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);} 

  
 
   String hour1 = String (h/10);
    String hour2 = String (h%10);
    String min1 = String (m/10);
    String min2 = String (m%10);
    String sec1 = String (s/10);
    String sec2 = String (s%10);
    int xh = 2;
    int xm = 19;
//    int xs = 28; //секунды

  

      matrix.drawChar(xh, y, hour1[0], HIGH, LOW, 1);
    matrix.drawChar(xh+6, y, hour2[0], HIGH, LOW, 1);
    matrix.drawChar(xm, y, min1[0], HIGH, LOW, 1);
    matrix.drawChar(xm+6, y, min2[0], HIGH, LOW, 1);
    matrix.write();


    
Serial.print(hour1);
Serial.print(hour2);
Serial.print(":");
Serial.print(min1);
Serial.print(min2);
Serial.print(":");
Serial.println(time.seconds);
//Serial.println(sec2);
Serial.println(sensor.pressure);
delay(1000);
   
}+++++++++++++++++*/



void DisplayTime()
{
 // sensors.requestTemperatures();             // Считываем показания температуры 
  clocks = String(time.gettime("His"))+" ";  // Время
  if(time.Hours == 23 && time.minutes == 30 && time.seconds == 55 && corrClock == 0){ // Действия внутри оператора if, будут выполняться если время 23:30:55 и не переводили часы (corrClock == 0)
  time.settime(5, -1, -1);                  // Корректируем - устанавливаем время. Так как у меня убегали на 50 сек. Часы (-1) не трогаем, минуты (-1) не трогаем, а сек ставим 5. Было 23:30:55 стало 23:30:05 - на 50 сек меньше.
  corrClock = 1;                             // перевели время (что бы в 23:30:55 опять не перевелись часы)
}
if(time.Hours==23 && time.minutes==59 && time.seconds==00){ //в  23:59:00...
 corrClock = 0;                                             // обнуляем переменную corrClock, что перевели время, что бы на следующие сутки в 23:30:55 опять перевелись часы   
}
 
  matrix.fillScreen(LOW);
  int y = (matrix.height() - 8) / 2;         // Центрируем текст по Вертикали
  // if(clocks[5] & 1){matrix.drawChar(14, y-1, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
//  else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}               //каждую НЕЧЕТНУЮ секунду НЕ ПЕЧАТАЕМ двоеточие по центру (чтобы мигало)
  if(clocks[5] & 1){matrix.drawChar(14, 0, (String(":"))[0], HIGH, LOW, 1);}    //каждую четную секунду печатаем двоеточие по центру (чтобы бегало)
  else{matrix.drawChar(14, -1, (String(":"))[0], HIGH, LOW, 1);}                //каждую НЕЧЕТНУЮ секунду печатаем двоеточие ВЫШЕ на 1 (чтобы бегало)
  
  int xh = 2;
  int xm = 19;
  matrix.drawChar(xh, y, clocks[0], HIGH, LOW, 1);
  matrix.drawChar(xh+6, y, clocks[1], HIGH, LOW, 1);
  matrix.drawChar(xm, y, clocks[2], HIGH, LOW, 1);
  matrix.drawChar(xm+6, y, clocks[3], HIGH, LOW, 1); 
  matrix.write();                                     // Вывод на дисплей
}




// =======================================================================
void ScrollText (String text){
    for ( int i = 0 ; i < width * text.length() + matrix.width() - 1 - spacer; i++ ) {
    if (refresh==1) i=0;
    refresh=0;
    matrix.fillScreen(LOW);
    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < text.length() ) {
        matrix.drawChar(x, y, text[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write(); // Вывод на дисплей
    delay(wait);
  }
}
// =======================================================================
/*float tempOffset = 1.5; //поправка уличного датчика
void getWeatherData()
{
 // weatherString = "t.дом: " + String(bmp.readTemperature(),1)+" ";
  weatherString += " темп.: " + String(  dht.readTemperature(), 1)+" `С ";
  weatherString += " влаж.: " + String(mesyc + dht.readHumidity()) + " % ";
}
// =======================================================================
float utcOffset = 18; //поправка часового пояса (при первом включении)
float minOffset = 42; //установка минут (при первом включении)
long localEpoc = 0;
long localMillisAtUpdate = 0;
// =======================================================================r
void updateTime()
{
  long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
  //long epoch = round(curEpoch + 3600 * utcOffset + 86400L) % 86400L;
  long epoch = round(curEpoch + 3600 * utcOffset + 86400L + (minOffset * 60)) % 86400L; //(minOffset * 60) - установка минут
  h = ((epoch  % 86400L) / 3600 ) % 24;
  m = (epoch % 3600) / 60;
  s = epoch % 60;
}*/
// ============================ латиница =================================
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30-1;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70-1;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
} 

 

bibo
Offline
Зарегистрирован: 26.03.2018

bibo
Offline
Зарегистрирован: 26.03.2018

Библиотека подключена. Что нужно этому монстру еще?

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

Сообщение компилятора секретно? Или, может, скопипастите сюда, чтоб мы могли полюбоваться?

kalapanga
Offline
Зарегистрирован: 23.10.2016

Функцию utf8rus в начало скетча перетащите, до её использования в коде.

Но в следующий раз сообщения компилятора вставляйте сюда текстом а не картинками.

bibo
Offline
Зарегистрирован: 26.03.2018
C:\Users\Documents\Arduino\last_clock_dh11_rtc1302_16.4\last_clock_dh11_rtc1302_16.4.ino: In function 'void loop()':

last_clock_dh11_rtc1302_16.4:121: error: 'utf8rus' was not declared in this scope

  ScrollText(utf8rus( mesyc + "влаж.  " + hum + " %    темп. " + temp + " `C " + "давл. " + pres1 + " атм "));

                                                                                                                          ^

last_clock_dh11_rtc1302_16.4:121: error: 'ScrollText' was not declared in this scope

  ScrollText(utf8rus( mesyc + "влаж.  " + hum + " %    темп. " + temp + " `C " + "давл. " + pres1 + " атм "));

                                                                                                                           ^

last_clock_dh11_rtc1302_16.4:127: error: 'DisplayTime' was not declared in this scope

   DisplayTime();

               ^

last_clock_dh11_rtc1302_16.4:134: error: 'Func_buttons_control' was not declared in this scope

   Func_buttons_control();

                        ^

C:\Users\Documents\Arduino\last_clock_dh11_rtc1302_16.4\last_clock_dh11_rtc1302_16.4.ino: At global scope:

last_clock_dh11_rtc1302_16.4:136: error: expected declaration before '}' token

 }

 ^

Несколько библиотек найдено для "Adafruit_GFX.h"
 Используется: C:\Users\Documents\Arduino\libraries\Adafruit_GFX_Library
Не используется: C:\Program Files (x86)\Arduino\libraries\Adafruit-GFX-Library-master
exit status 1
'utf8rus' was not declared in this scope

от так ругается.

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

bibo, ну, Вам же только что писали - копипастите текст и вставляёте сюда текст. Вы сами можете свою кратинку прочитать? Даже если и прочитать, там начало не поместилось! Копируйте текст и вставляйте.

kalapanga
Offline
Зарегистрирован: 23.10.2016

То, что я написал про utf8rus, всех функций касается. Исправьте, а потом смотрите, где скобка потерялась.

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

Да, чего там её смотреть, удалить 136 строку и всего делов.

bibo
Offline
Зарегистрирован: 26.03.2018

да, со скобками была неразбериха. но после правки выдал нечто новое.

Похоже, что весь скетч есть большой косяк.

 

last_clock_dh11_rtc1302_16.4:121: error: expected unqualified-id before 'if'

   if(millis()-clkTime > 60000 && !del && dots) { // через каждые 60000 мс запускаем бегущую строку

   ^

last_clock_dh11_rtc1302_16.4:128: error: expected constructor, destructor, or type conversion before ';' token

   DisplayTime();

                ^

last_clock_dh11_rtc1302_16.4:129: error: 'time' does not name a type

   time.blinktime(migSet);                                         // мигаем устанавливаемым параметром (migSet больше 0) при установке времени

   ^

last_clock_dh11_rtc1302_16.4:130: error: expected unqualified-id before 'if'

   if(millis()-dotTime > 500) 

   ^

last_clock_dh11_rtc1302_16.4:135: error: expected constructor, destructor, or type conversion before ';' token

   Func_buttons_control();

                         ^

last_clock_dh11_rtc1302_16.4:136: error: expected declaration before '}' token

 }

 ^

Несколько библиотек найдено для "Adafruit_GFX.h"
 Используется: C:\Users\Documents\Arduino\libraries\Adafruit_GFX_Library
Не используется: C:\Program Files (x86)\Arduino\libraries\Adafruit-GFX-Library-master
exit status 1
expected unqualified-id before 'if'

 

bibo
Offline
Зарегистрирован: 26.03.2018

>>то, что я написал про utf8rus, всех функций касается. Исправьте, а потом смотрите, где скобка потерялась.<<

 

нашел все лишние скобки, проблема разрешилась. спасибо)

если интересно,  то проглядел 259 строку)

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

Так, что, больше нет проблем? Если остались, то публикуйте не только сообщения, но и свежий скетч, а то хрен его знает какие там теперь номера строк, и что Вы правили.

bibo
Offline
Зарегистрирован: 26.03.2018

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

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

пока еще не победил кнопки.  по идее должно быть так: нажатием на кнопку один выбираем часы или минуты, а нажатиями кнопки 2 изменяет значения часов или минут.  в данном скетче они вообще не работают. ежели не использовать встроенные подтягивающие резисторы(вместо input_pullup юзать просто input),  тогда кнопки "дребезжат", то е сть рандомно изменяют значения часов и минут и не т возможности установить необходимые значения.

#include <iarduino_Pressure_BMP.h>

#include <Wire.h>
#include "DHT.h"  // подключаем библиотеку для работы с датчиком DHT
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
 #include <iarduino_RTC.h>

#define DHTTYPE DHT11   // DHT 11
#define DHTPIN 2    
// #define pin_SW_SDA 4                                    // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
//  #define pin_SW_SCL 9
//const int buttonPin = 8;     // the number of the pushbutton pin

iarduino_Pressure_BMP sensor;  
iarduino_RTC time(RTC_DS1302, 5, 7, 6);   // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
DHT dht(DHTPIN, DHTTYPE);

int buttonState; 
int wait = 25; // скорость бегущей строки
int spacer = 2;
int width = 5 + spacer; // Регулируем расстояние между символами
int refresh=0;
int pinCS = 10; // Подключение пина CS
int numberOfHorizontalDisplays = 4; // Количество светодиодных матриц по Горизонтали
int numberOfVerticalDisplays = 1; // Количество светодиодных матриц по Вертикали
String weatherString;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);


/*=========================кнопки======================*/



const uint8_t PIN_button_SET  = 8;            // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP   = 3;            // указываем номер вывода arduino, к которому подключена кнопка UP
//const uint8_t PIN_button_DOWN = 5;            // указываем номер вывода arduino, к которому подключена кнопка DOWN
bool     button_state1      = false;          // статус кнопки 1
bool     button_state2      = false;          // статус кнопки 2
bool     button_long_state  = false;          // удержание кнопки (код выполнится один раз)
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;

uint8_t corrClock = 0;                        // корректировали время или нет
uint8_t updCnt = 0;
uint8_t dots = 0;
long dotTime = 0;
long clkTime = 0;

const uint8_t DS18B20 = 8;                    // Указываем, к какому выводу подключена DQ (уличн темп)

uint8_t wibor = 0;                            // После того как длительно нажали на кнопку SET можно будет нажимать коротко
uint8_t mig = 0;
uint8_t migSet = 0;
uint8_t migTime = 0;
long previousMillis = 0;
uint8_t val=0; 
String clocks;

//int updCnt = 0;
//int dots = 0;
//long dotTime = 0;
//long clkTime = 0;
byte del=0;
int h,m,s, hum, temp;
float  pres, pres1;
String mesyc = " ";




/*===================================================================================*/
void setup(void) {
  Serial.begin(9600);
    time.begin();
//time.settime(0,23,17,18,4,18,3);//секунды, минуты,часы,число,месяц,год,день недели


/*=========================кнопки======================*/
pinMode(PIN_button_SET, INPUT_PULLUP);      // кнопки
  pinMode(PIN_button_UP, INPUT_PULLUP);

/*=====================================================*/


 dht.begin();//датчик влажности и температуры
  sensor.begin(); //датчик давления
   
  matrix.setIntensity(0); // Яркость матрицы от 0 до 15
  matrix.setRotation(matrix.getRotation()+2); //1 - 90  2 - 180   3 - 270 угол поворота
// начальные координаты матриц 8*8
  matrix.setRotation(0, 1);        // 1 матрица
  matrix.setRotation(1, 1);        // 2 матрица
  matrix.setRotation(2, 1);        // 3 матрица
  matrix.setRotation(3, 1);        // 4 матрица
}



/*==================================================================================*/
void loop(void) {

  //Serial.println(time.gettime("H:i")); // выводим время
  
 if(updCnt<=0) 
  { // каждые 10 циклов получаем данные времени и погоды
    updCnt = 1;
   time.gettime();
   sensor.read(2);
   String mesyc = " ";
 hum = dht.readHumidity();
 temp = sensor.temperature;
 pres = sensor.pressure/101325;
 pres1 = pres/1.5;
    clkTime = millis();
 }


 
  if(millis()-clkTime > 60000 && !del && dots) { // через каждые 60000 мс запускаем бегущую строку
 ScrollText(utf8rus( mesyc + "влаж.  " + hum + " %    темп. " + temp + " `C " + "давл. " + pres1 + " атм "));
  updCnt--;
  clkTime = millis();
  mig = 0;   
  }

  DisplayTime();
  time.blinktime(migSet);                                         // мигаем устанавливаемым параметром (migSet больше 0) при установке времени
  if(millis()-dotTime > 500) 
  {
    dotTime = millis();
    dots = !dots;
  }
  Func_buttons_control();
}






/*================================функция для работы кнопок=============================*/
void Func_buttons_control()
{
   uint32_t ms    = millis();
   bool pin_state1 = digitalRead(PIN_button_SET); // кнопка SET
   bool pin_state2 = digitalRead(PIN_button_UP);  // 2 кнопка
//=========================================================================== кнопка SET
// Фиксируем нажатие кнопки  SET
  if( pin_state1  == LOW && !button_state1 && ( ms - ms_button ) > 50 ){
      button_state1     = true;
      button_long_state = false;
      ms_button         = ms;
      if(wibor == 1)
        switch (mig) 
        {
          case 1:         // кнопка SET выбор мин
            migSet = 2;
            mig = 2;
            break;
          case 2:         // кнопка SET сброс сек на 00
            migSet = 0;                                   // НЕмигают минуты и часы
            mig = 0;
            time.settime(0, -1, -1);                      // Сбросит секунды на 0, а часы, минуты и дату, оставит без изменений.
            wibor = 0;
            break;
        }  
  }
// После 2000 мс нажатия кнопки SET единоразово выполним код
  if( pin_state1  == LOW && !button_long_state && ( ms - ms_button ) > 2000 ) // кнопка SET выбор час
  {
    migSet = 3;
    mig = 1;  
    wibor = 1;                                     // длительно нажали
  }
// Фиксируем отпускание кнопки SET 
   if( pin_state1 == HIGH && button_state1 && ( ms - ms_button ) > 50  ){
      button_state1     = false;   
      ms_button         = ms;
      Serial.println("No Press 2"); //действие после отпуска длительного нажатия
   }   
  //===========================================  Кнопка UP (Установка часов)
  if(mig == 1 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )
  { 
    button_state2     = true;
    ms_button         = ms;
    migSet = 0;
    time.Hours ++;                            // прибавляем единицу к часам
    if (time.Hours > 23) time.Hours = 0;      // если вылезли за границы присваеваем 0
    time.settime(-1, -1, time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  }
  if(mig == 1 && pin_state2  == LOW && ( ms - ms_button ) > 1000 && ( ms - ms_auto_click )>300 ) // После 1000 мс нажатия кнопки каждые 400 мс фиксируем событие нажатия  
  {
    ms_auto_click     = ms;
    migSet = 0;
    time.Hours ++;                            // прибавляем единицу к часам
    if (time.Hours > 23) time.Hours = 0;      // если вылезли за границы присваеваем 0
    time.settime(-1, -1, time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  }
  //===========================================  Кнопка UP (Установка минут)
  if(mig == 2 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )
  { 
    button_state2     = true;
    ms_button         = ms;
    migSet = 0;
    time.minutes ++;                          // прибавляем единицу к минутам
    if (time.minutes > 59) time.minutes = 0;  // если вылезли за границы присваеваем 0
    time.settime(-1, time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  }
  if(mig == 2 && pin_state2  == LOW && ( ms - ms_button ) > 1000 && ( ms - ms_auto_click )>300 ) // После 1000 мс нажатия кнопки каждые 400 мс фиксируем событие нажатия  
  {
    ms_auto_click     = ms;
    migSet = 0;
    time.minutes ++;                          // прибавляем единицу к минутам
    if (time.minutes > 59) time.minutes = 0;  // если вылезли за границы присваеваем 0
    time.settime(-1, time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  }
  //===========================================  Кнопка UP (Установка минут) вызов бегущей строки  
  if(mig == 0 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )
  { 
    mig = 3;
  } 
//==============================================================================  Кнопка UP ( Фиксируем отпускание кнопки установки часов/минут  )
  if(pin_state2 == HIGH && button_state2 && ( ms - ms_button ) > 50  )
  {
    button_state2     = false;   
    ms_button         = ms;
    if(mig == 1){migSet = 3;}
    if(mig == 2){migSet = 2;}
  }
}


/*================================функция для работы кнопок заверешена =============================*/










  /*DisplayTime();
  if(millis()-dotTime > 500) {
    dotTime = millis();
    dots = !dots;
  }
//  buttonState = digitalRead(buttonPin);
  
 //if (buttonState == HIGH) {
       // ScrollText(utf8rus( mesyc + "влаж.  " + hum + " %    темп. " + temp + " `C " + "давл. " + pres1 + " атм " ));
        
  } 
  

  
}*/

// =======================================================================
/*+++++++++++++

 void DisplayTime(){
  time.gettime();
    h = time.Hours;
 m = time.minutes;

    matrix.fillScreen(LOW);
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали

    
 
if(time.seconds&1 ){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);}
      else  {matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);} 

  
 
   String hour1 = String (h/10);
    String hour2 = String (h%10);
    String min1 = String (m/10);
    String min2 = String (m%10);
    String sec1 = String (s/10);
    String sec2 = String (s%10);
    int xh = 2;
    int xm = 19;
//    int xs = 28; //секунды

  

      matrix.drawChar(xh, y, hour1[0], HIGH, LOW, 1);
    matrix.drawChar(xh+6, y, hour2[0], HIGH, LOW, 1);
    matrix.drawChar(xm, y, min1[0], HIGH, LOW, 1);
    matrix.drawChar(xm+6, y, min2[0], HIGH, LOW, 1);
    matrix.write();


    
Serial.print(hour1);
Serial.print(hour2);
Serial.print(":");
Serial.print(min1);
Serial.print(min2);
Serial.print(":");
Serial.println(time.seconds);
//Serial.println(sec2);
Serial.println(sensor.pressure);
delay(1000);
   
}+++++++++++++++++*/



void DisplayTime()
{
 // sensors.requestTemperatures();             // Считываем показания температуры 
  clocks = String(time.gettime("His"))+" ";  // Время
  if(time.Hours == 23 && time.minutes == 30 && time.seconds == 55 && corrClock == 0){ // Действия внутри оператора if, будут выполняться если время 23:30:55 и не переводили часы (corrClock == 0)
  time.settime(5, -1, -1);                  // Корректируем - устанавливаем время. Так как у меня убегали на 50 сек. Часы (-1) не трогаем, минуты (-1) не трогаем, а сек ставим 5. Было 23:30:55 стало 23:30:05 - на 50 сек меньше.
  corrClock = 1;                             // перевели время (что бы в 23:30:55 опять не перевелись часы)
}
if(time.Hours==23 && time.minutes==59 && time.seconds==00){ //в  23:59:00...
 corrClock = 0;                                             // обнуляем переменную corrClock, что перевели время, что бы на следующие сутки в 23:30:55 опять перевелись часы   
}
 
  matrix.fillScreen(LOW);
  int y = (matrix.height() - 8) / 2;         // Центрируем текст по Вертикали
   if(clocks[5] & 1){matrix.drawChar(14, y-1, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
  else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}               //каждую НЕЧЕТНУЮ секунду НЕ ПЕЧАТАЕМ двоеточие по центру (чтобы мигало)
 // if(clocks[5] & 1){matrix.drawChar(14, 0, (String(":"))[0], HIGH, LOW, 1);}    //каждую четную секунду печатаем двоеточие по центру (чтобы бегало)
  //else{matrix.drawChar(14, -1, (String(":"))[0], HIGH, LOW, 1);}                //каждую НЕЧЕТНУЮ секунду печатаем двоеточие ВЫШЕ на 1 (чтобы бегало)
  
  int xh = 2;
  int xm = 19;
  matrix.drawChar(xh, y, clocks[0], HIGH, LOW, 1);
  matrix.drawChar(xh+6, y, clocks[1], HIGH, LOW, 1);
  matrix.drawChar(xm, y, clocks[2], HIGH, LOW, 1);
  matrix.drawChar(xm+6, y, clocks[3], HIGH, LOW, 1); 
  matrix.write();                                     // Вывод на дисплей
}




// =======================================================================
void ScrollText (String text){
    for ( int i = 0 ; i < width * text.length() + matrix.width() - 1 - spacer; i++ ) {
    if (refresh==1) i=0;
    refresh=0;
    matrix.fillScreen(LOW);
    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < text.length() ) {
        matrix.drawChar(x, y, text[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write(); // Вывод на дисплей
    delay(wait);
  }
}
// =======================================================================
/*float tempOffset = 1.5; //поправка уличного датчика
void getWeatherData()
{
 // weatherString = "t.дом: " + String(bmp.readTemperature(),1)+" ";
  weatherString += " темп.: " + String(  dht.readTemperature(), 1)+" `С ";
  weatherString += " влаж.: " + String(mesyc + dht.readHumidity()) + " % ";
}
// =======================================================================
float utcOffset = 18; //поправка часового пояса (при первом включении)
float minOffset = 42; //установка минут (при первом включении)
long localEpoc = 0;
long localMillisAtUpdate = 0;
// =======================================================================r
void updateTime()
{
  long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
  //long epoch = round(curEpoch + 3600 * utcOffset + 86400L) % 86400L;
  long epoch = round(curEpoch + 3600 * utcOffset + 86400L + (minOffset * 60)) % 86400L; //(minOffset * 60) - установка минут
  h = ((epoch  % 86400L) / 3600 ) % 24;
  m = (epoch % 3600) / 60;
  s = epoch % 60;
}*/
// ============================ латиница =================================
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30-1;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70-1;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
} 

 

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

bibo пишет:
на основе чужих скетчей .... мне пока и так пойдет
Не пойдёт. И чем раньше Вы это поймёте, и начнёте писать сами, тем меньше времени потеряете и меньше шишек набьёте граблями :)

bibo
Offline
Зарегистрирован: 26.03.2018

ЕвгенийП пишет:

bibo пишет:
на основе чужих скетчей .... мне пока и так пойдет
Не пойдёт. И чем раньше Вы это поймёте, и начнёте писать сами, тем меньше времени потеряете и меньше шишек набьёте граблями :)

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