Здравствуйте.Вот эта кнопка запускает только бегущую строку и всё ?Дим wrote:uint32_t Key1 = 0x2FD50AF; // Определяем код кнопки ПДУ OK
Code: Select all
#include <Adafruit_BMP280.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <DallasTemperature.h>
#include "IRremote.h"
IRrecv irrecv(12); // указываем вывод, к которому подключен ИК приемник
decode_results results;
uint32_t Key1 = 0x40BF30CF; // Определяем код кнопки ПДУ OK
uint32_t Key2 = 0x40BF7887; // Определяем код кнопки ПДУ лево
uint32_t Key3 = 0x40BFF807; // Определяем код кнопки ПДУ право
#include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
iarduino_RTC time(RTC_DS1307); // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
Adafruit_BMP280 bmp280;
// ============================== кнопки
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 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;
uint8_t wait = 40; // скорость бегущей строки
uint8_t spacer = 2;
uint8_t width = 5 + spacer; // Регулируем расстояние между символами
uint8_t refresh=0;
const uint8_t pinCS = 10; // Подключение пина CS
uint8_t numberOfHorizontalDisplays = 4; // Количество светодиодных матриц по Горизонтали
uint8_t numberOfVerticalDisplays = 1; // Количество светодиодных матриц по Вертикали
String weatherString; // бегущая строка
String clocks; // время
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
OneWire oneWire(DS18B20);
DallasTemperature sensors(&oneWire);
byte brightness = 0; // Яркость матрицы от 0 до 15
// ===================================================================================================================================
void setup(void) {
Serial.begin( 9600 ); // Инициируем передачу данных в монитор последовательного порта
irrecv.enableIRIn(); // запускаем прием ИК приемника
if (!bmp280.begin()) //для температуры улицы
{
while (1) {}
}
time.begin(); // Инициируем работу с модулем.
//time.settime(0,27,21,03,01,18,3); // Записываем время в модуль: 0 сек, 27 мин, 21 час, 3, января, 2018 года, среда. time.settime(0,27,21,03,01,18,3);
matrix.setIntensity(brightness); // Яркость матрицы от 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 матрица
pinMode(PIN_button_SET, INPUT_PULLUP); // кнопки
pinMode(PIN_button_UP, INPUT_PULLUP);
// pinMode(PIN_button_DOWN, INPUT_PULLUP);
// digitalWrite(PIN_button_SET ,HIGH);
}
// =======================================================================
void loop(void)
{
Serial.println( time.gettime("d-m-y, H:i:s, D") );
if(updCnt<=0)
{ // каждые 10 циклов получаем данные времени и погоды
updCnt = 1;
getWeatherData();
clkTime = millis();
}
// if((millis()-clkTime > 600000 && dots && mig == 0) || (mig == 3))// Через 10 минут/600000 мили/сек и не переводим часы (mig == 0) (или нажата кнопа UP) запускаем бегущую строку
if(((time.minutes == 9 || time.minutes == 19 || time.minutes == 29 || time.minutes == 39 || time.minutes == 49 || time.minutes == 59) && time.seconds == 59 && mig == 0) || (mig == 3))
{ // каждые (9,19,29,39,49,59) минут и 59 секунд и не переводим часы (mig == 0)(или нажата кнопа UP) запускаем бегущую строку
ScrollText(utf8rus("Н-Тагил рулит!")); // любой ваш текст строки
ScrollText(utf8rus(weatherString)); // текст температуры и давления
updCnt--;
ScrollText( utf8rus(time.gettime("d-m-Y D"))); // вывод даты
clkTime = millis();
mig = 0; // переменная mig не 3, для кнопки вызова бегущей строки, что бы не циклило её
}
DisplayTime();
time.blinktime(migSet); // мигаем устанавливаемым параметром (migSet больше 0) при установке времени
if(millis()-dotTime > 500)
{
dotTime = millis();
dots = !dots;
}
Func_buttons_control();
if ( irrecv.decode( &results ))
{ // если данные с ПДУ пришли
if (results.value == Key1) // если нажата кнопка 1
{mig = 3;} // запускаем бегущую строку
if (results.value == Key2) // если нажата кнопка 2
{brightness --;} // убавляем переменную яркости матрицы
if (brightness == 255) brightness = 15; // если вылезли за границы присваеваем 15
{matrix.setIntensity(brightness);} // устанавливаем яркость матрицы
if (results.value == Key3) // если нажата кнопка 3
{brightness ++;} // прибавляем переменную яркости матрицы
if (brightness > 15) brightness = 0; // если вылезли за границы присваеваем 0
{matrix.setIntensity(brightness);} // устанавливаем яркость матрицы
irrecv.resume(); // принимаем следующую команду
}
}
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;}
}
}
void DisplayTime()
{
sensors.requestTemperatures(); // Считываем показания температуры
clocks = String(time.gettime("His"))+" "; // Время
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 = -0.5; //поправка уличного датчика
void getWeatherData()
{
weatherString = " t.дом: " + String(bmp280.readTemperature(),1)+" ";
weatherString += " улица: " + String(sensors.getTempCByIndex(0) - tempOffset, 1)+" ";
weatherString += " Давл: " + String(bmp280.readPressure()/132.95) + " мм рт.ст "; //131.42 поправка для вашего местоположения
}
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;
}
Users browsing this forum: 1 guest