Прошу помощи в разрешении проблемы с utf8rus [Adafruit_GFX]
- Войдите на сайт для отправки комментариев
Ср, 18/04/2018 - 15:12
Не могу понять, в чем причина отказа компилироваться. Может вы увидите косяк? Гугл не помог( Ну или я не догнал, какой именно совет из гугла можно взять.
#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;
}
Библиотека подключена. Что нужно этому монстру еще?
Сообщение компилятора секретно? Или, может, скопипастите сюда, чтоб мы могли полюбоваться?
Функцию utf8rus в начало скетча перетащите, до её использования в коде.
Но в следующий раз сообщения компилятора вставляйте сюда текстом а не картинками.
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от так ругается.
bibo, ну, Вам же только что писали - копипастите текст и вставляёте сюда текст. Вы сами можете свою кратинку прочитать? Даже если и прочитать, там начало не поместилось! Копируйте текст и вставляйте.
То, что я написал про utf8rus, всех функций касается. Исправьте, а потом смотрите, где скобка потерялась.
Да, чего там её смотреть, удалить 136 строку и всего делов.
да, со скобками была неразбериха. но после правки выдал нечто новое.
Похоже, что весь скетч есть большой косяк.
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'>>то, что я написал про utf8rus, всех функций касается. Исправьте, а потом смотрите, где скобка потерялась.<<
нашел все лишние скобки, проблема разрешилась. спасибо)
если интересно, то проглядел 259 строку)
Так, что, больше нет проблем? Если остались, то публикуйте не только сообщения, но и свежий скетч, а то хрен его знает какие там теперь номера строк, и что Вы правили.
проблемы еще есть, они из другой оперы. дело в том, что я вообще новичок. и разбираюсь потихоньку на основе чужих скетчей. отдаю отчет, что неправильный подход, но мне пока и так пойдет)
в данном скетче я разобрался в использованием библиотек для своих датчиков, с некоторыми фукциями этих библиотек и так далее(думаю, по правкам видно).
пока еще не победил кнопки. по идее должно быть так: нажатием на кнопку один выбираем часы или минуты, а нажатиями кнопки 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; }а разве есть какой-нибудь источник с упорядоченым изложением теоретических основ? разрозненной инфы много, а собрать ее в кучу человеку, весьма далекому от программирования, весьма сложно, а особенно на первоначальном этапе.