с точки зрения программирования это тоже самое, как простое мигание. Пример показывает, как это сделать без задержкиМне не простое мигание нужно было, а затухание с обратным эффектом в цикле,
с точки зрения программирования это тоже самое, как простое мигание. Пример показывает, как это сделать без задержкиМне не простое мигание нужно было, а затухание с обратным эффектом в цикле,
Целый урок этому посвящен https://alexgyver.ru/lessons/arduino-led/Вы не поняли смысла первого кода и библиотеки. Мне не простое мигание нужно было, а затухание с обратным эффектом в цикле, то есть Fade Out -> Fade In -> Fade Out -> ... (и так в цикле пока работает любой режим кроме режима 0).
// Пример использования библиотеки GyverButton на нажатие
#define BTN_PIN 5 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)
#include "GyverButton.h"
GButton butt1(BTN_PIN);
void setup() {
Serial.begin(9600);
}
void loop() {
butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться
if (butt1.isPress()) Serial.println("Single"); // проверка на один клик
}
Это нажата? А как она подключена?if (digitalRead (5) == HIGH) Serial.println ("кнопка нажата");
Роль кнопки у меня играет радио модуль, при нажатии на кнопку пульта, приемник выдает на выходе "грязный" сигнал высокого порядка HIGH (при одном нажатии выдает сразу несколько). Пин к которому подключен радио модуль "подтянут" резистором (PULL_DOWN). и поскольку выходной сигнал не чистый, я воспользовался данной библиотекой, как оказалось функция butt1.isPress каким то образом сглаживает все эти помехи и выдает чистый единичный HIGH при единичном нажатии на кнопку пульта. Но все бы ничего если бы он не выдавал ложное нажатие при включении ардуино.Это нажата? А как она подключена?
При начальной подаче питания?при включении ардуино. ?
да, при перезагрузке, reset, при начальной подаче питания, и после загрузке скетча. Короче говоря при запуске программы.Что значит
При начальной подаче питания?
GButton btn(pin, LOW_PULL);
// HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND)
// LOW_PULL - кнопка подключена к VCC, пин подтянут к GND
// по умолчанию стоит HIGH_PULL
butt1.setType(LOW_PULL);
// NORM_OPEN - нормально-разомкнутая кнопка
// NORM_CLOSE - нормально-замкнутая кнопка
// по умолчанию стоит NORM_OPEN
butt1.setDirection(NORM_OPEN);
фиг с ней с дальностью, дефект-то (включение кнопки про рестарте) - остался или пропал?воспользовался данными настройками и получилось что при использовании (LOW_PULL) каким то образом дальность приема сигнала радио модуля снизилась
Да дефект ушел, но теперь мне бы хотелось узнать каким образом дальность приема сигнала уменьшилась (дальность приема где то 5 см), и как это исправить, думаю дело в силе сигнала, чем ближе пульт к приемнику, тем сильнее сигнал и ардуино воспринимает этот сильный сигнал как HIGH, если же пульт дальше то сигнал слабее и ардуино его воспринимает как LOW. Но это всего лишь мои догадки.фиг с ней с дальностью, дефект-то (включение кнопки про рестарте) - остался или пропал?
это фантастикачем ближе пульт к приемнику, тем сильнее сигнал и ардуино воспринимает этот сильный сигнал как HIGH, если же пульт дальше то сигнал слабее и ардуино его воспринимает как LOW.
У вас подтяжка пина на GND как сделана? внешним резистором ? или в приемнике уже есть ?
А может вы вообще про нее забыли?
#include <LEDFader.h>
#include <GyverButton.h>
int mode, brightness = 255, brigh_tick, cycle, fadeAmount = 5;
unsigned long currentTime, loopTime;
boolean brightDirection = true, wasStep = false;
int MainLPin = 3; //PWM = D3 = Main-Light (Yellow Wire)
int MiniLPin = 10; //PWM = D10 = 2 Mini-Light (Green Wire)
int SoftLPin = 12; //NoPWM = D12 = Soft-Light (White Wire)
int BackLPin = 11; //PWM = D11 = Back-Light (Blue Wire)
int BtnPin = A0; //BTN = A0 Main Button (Black Wires)
GButton butt1(BtnPin);
LEDFader led = LEDFader(BackLPin);
/*
Modes:
=One Btn Click change mode
=Holding Btn - Brightness +/-
=Double Click - All Off in 1-5 Modes
0 - All off
1 - Main Light On
2 - Soft Light On
3 - 2 Mini-lights On
4 - Main Light & Soft Light On
5 - 2 Mini-lights & Soft Light On
*/
void setup() {
led.fade(255, 2500);
mode = 0;
cycle = 0;
brigh_tick = 0; // if bright_tick = 0 then brightness go low, if bright_tick = 1 then brightness go high
currentTime = millis();
loopTime = currentTime;
pinMode(MainLPin,OUTPUT);
pinMode(MiniLPin,OUTPUT);
pinMode(SoftLPin,OUTPUT);
pinMode(BackLPin,OUTPUT);
butt1.setDebounce(90);
butt1.setTimeout(300);
butt1.setType(HIGH_PULL);
butt1.setDirection(NORM_OPEN);
butt1.setTickMode(AUTO);
butt1.setStepTimeout(30);
digitalWrite(MainLPin, LOW);
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, LOW);
digitalWrite(BackLPin, LOW);
}
void loop() {
if (mode == 0){ //Mode:0 ALL OFF
digitalWrite(MainLPin, LOW);
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, LOW);
digitalWrite(BackLPin, LOW);
if (butt1.isSingle()) mode++;
}
if (mode > 0){ //Turn On Back Light Fading mode for all modes except 0
led.update();
if (led.is_fading() == false) {
// Fade from 255 - 0
if (led.get_value() == 255) {
led.fade(0, 3000);
}
// Fade from 0 - 255
else {
led.fade(255, 3000);
}
}
}
if (mode == 1){ //Turn On Main Light
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, LOW);
if (cycle == 1) brightness = 255;
if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
mode = 0;
brigh_tick = 0;
brightness = 255;
}
if (butt1.isStep()) {
wasStep = true;
if (brightDirection) {
brightness -= 5;
} else {
brightness += 5;
}
brightness = constrain(brightness, 3, 255);
}
if (butt1.isRelease()) {
if (wasStep) {
wasStep = false;
brightDirection = !brightDirection;
}
}
analogWrite(MainLPin, brightness);
}
if (mode == 2){ //Turn On Soft Light
digitalWrite(MainLPin, LOW);
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, HIGH);
cycle = 1;
if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
mode = 0;
brigh_tick = 0;
brightness = 255;
}
}
if (mode == 3){ //Turn On 2 Mini-Lights
digitalWrite(MainLPin, LOW);
digitalWrite(SoftLPin, LOW);
if (cycle == 1) brightness = 255;
if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
mode = 0;
brigh_tick = 0;
brightness = 255;
}
if (butt1.isStep()) {
wasStep = true;
if (brightDirection) {
brightness -= 5;
} else {
brightness += 5;
}
brightness = constrain(brightness, 3, 255);
}
if (butt1.isRelease()) {
if (wasStep) {
wasStep = false;
brightDirection = !brightDirection;
}
}
analogWrite(MiniLPin, brightness);
}
if (mode == 4){ //Turn On Main Light & Soft Light
digitalWrite(MainLPin, HIGH);
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, HIGH);
if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
mode = 0;
brigh_tick = 0;
brightness = 255;
}
}
if (mode == 5){ //Turn On 2 Mini-lights & Soft Light On
digitalWrite(MainLPin, LOW);
digitalWrite(MiniLPin, HIGH);
digitalWrite(SoftLPin, HIGH);
if (butt1.isSingle()) mode++;
if (mode == 6){
mode = 0;
cycle = 1;
}
if (butt1.isDouble()){
mode = 0;
brigh_tick = 0;
brightness = 255;
}
}
}
#include <GyverButton.h> // библиотека кнопок
GButton up(4, LOW_PULL); // Кнопки
GButton down(5, LOW_PULL);
GButton ok(3, LOW_PULL);
bool n=1; // флаг инвертора
void setup() {
ok.setTickMode(AUTO); //
up.setTickMode(AUTO); // кнопки опрашиваются автоматически
down.setTickMode(AUTO);
}
void loop() {
if (ok.isHolded()) { //вход в меню при удержании кнопки ок
menu();
}
if (up.isClick() || down.isClick()) {
disp = !disp;
oled.clear();
}
if (down.isHolded()) { //вкл/выкл инвертора удержанием кнопки
n=!n;
digitalWrite(Check220, n);
}
ammetr();
printTime(); //вывод инфы на дисплей
provBudil(); //проверка исполнения таймеров
saveAccum(); //проверка сохранения жизни аккумулятора панели и переключение при низком заряде на сеть 220В
peredacha (); //отправка данных на esp
}
void printTime() { // вывод главное экрана с временем и значениями
switch (disp) {
case 0: {
if (millis() - bmeup >= 2000) {
bme.oneMeasurement(); // Просим датчик проснуться и сделать одно преобразование
while (bme.isMeasuring());
temp = bme.readTemperature();
Humidity = int(bme.readHumidity());
davlen = int(pressureToMmHg((bme.readPressure())));
bmeup = millis();
}
DateTime now = rtc.getTime();
bool ftimer[3]; EEPROM.get(12, ftimer);
oled.home();
oled.setScale(2);
if (now.hour < 10) oled.print(F("0"));
oled.print(now.hour);
oled.print(F(":"));
if (now.minute < 10) oled.print(F("0"));
oled.print(now.minute);
oled.print(F(":"));
if (now.second < 10) oled.print(F("0"));
oled.print(now.second);
printFromPGM(&week[now.day - 1]);
oled.println();
oled.setScale(1);
oled.print(F(" "));
oled.print(now.date);
oled.print(F(" "));
printFromPGM(&mesyac[now.month - 1]); //oled.print(now.month);
oled.print(F(" "));
oled.print(now.year);
oled.println(F("г."));
oled.setCursor(0, 4);
oled.print(F("Темп = "));
oled.print(temp,1);
oled.print(F("*C"));
oled.println(F(" "));
oled.print(F("Влажность = "));
oled.print(Humidity);
oled.print(F("%"));
oled.println(F(" "));
oled.print(F("Давлен = "));
oled.print(davlen);
oled.print(F("mmHg"));
oled.println(F(" "));
if (contr) oled.print(F("hold menu for exit"));
else oled.print(F("сменить вид нажми +-"));
oled.setCursor(0, 3);
if (contr) {
oled.print(F("Яркость: "));
oled.invertText(true);
oled.print(cont / 10);
oled.invertText(false);
if (cont/10>=10) oled.print(F(" "));
else oled.print(F(" "));
}
else oled.print(F(" "));
if(faccum) {
oled.invertText(true); oled.print(F(" ! ")); oled.invertText(false);
}
else oled.print(F(" "));
if(!n) {
oled.setCursor(85, 3); oled.invertText(true); oled.print(F(" Ин ")); oled.invertText(false);
}
else oled.print(F(" "));
for (byte i = 0; i < 3; i++) {
if (flagTimer[i]) {
oled.invertText(true); oled.print(F(" T ")); oled.invertText(false);
}
}
oled.update();
break;}
case 1: {
oled.home();
oled.setScale(1);
oled.print(F("Напряжение: ")); //напряжение сети
oled.print(analogRead(Volt) * 0.01464, 1);
oled.print(F("V"));
oled.println(F(" "));
oled.print(F("потреб = "));
if (Watt > 1000) {
oled.print (Watt / 1000, 3);
oled.print(F(" kВт"));
oled.println(F(" "));
}
else {
oled.print (Watt, 2);
oled.print(F(" Вт"));
oled.println(F(" "));
}
oled.print(F("сила тока= "));
oled.print((analogRead(Amp) * 0.05922));
oled.print(F(" А"));
oled.println(F(" "));
oled.print(F("сменить вид нажми +-"));
oled.update();
break;
}
}
}
void printFromPGM(int charMap) { //чтение данных из массивов progmem и вывод на экран
char buffer[24]; // буфер для хранения строки
uint16_t ptr = pgm_read_word(charMap); // получаем адрес из таблицы ссылок
uint8_t i = 0; // переменная - индекс массива буфера
do {
buffer[i] = (char)(pgm_read_byte(ptr++)); // прочитать символ из PGM в ячейку буфера, подвинуть указатель
} while (buffer[i++] != NULL); // повторять пока прочитанный символ не нулевой, подвинуть индекс буфера
oled.print(buffer);
} // печатаем готовую строку
void menu() { //меню настроек устройства
oled.clear();
while (1) { //меню настроек при удержании кнопки ок
static int8_t pointer = 0; // Переменная указатель
/* Кнопки */
if (up.isClick() or up.isHold()) { // Если кнопку нажали или удерживают
pointer = constrain(pointer - 1, 0, ITEMS - 1); // Двигаем указатель в пределах дисплея
}
if (down.isClick() or down.isHold()) {
pointer = constrain(pointer + 1, 0, ITEMS - 1);
}
if (ok.isClick()) { // Нажатие на ОК - переход в пункт меню
switch (pointer) { // По номеру указателей располагаем вложенные функции (можно вложенные меню)
case 0: Budilnic(); break; // По нажатию на ОК при наведении на 0й пункт вызвать функцию
case 1: setVremya(); break;
case 2: Yarkoct(); break;
}
}
/* меню */
// oled.clear(); // Очищаем буфер
oled.home(); // Курсор в левый верхний угол
oled.println (F(" SET таймер 220В"));
oled.println (F(" SET дата и время"));
oled.println (F(" Яркость экрана"));
printPointer(pointer); // Вывод указателя
oled.update(); // Выводим кадр на дисплей
provBudil(); //проверка исполнения таймеров
saveAccum(); //проверка сохранения жизни аккумулятора панели и переключение при низком заряде на сеть 220В
peredacha ();
ammetr();
if (ok.isHolded()) return;
}
}
void printPointer(uint8_t pointer) { //отображеие курсора в меню
oled.setCursor(0, pointer);
oled.print(">");
}
void setVremya (void) { //раздел меню Set дата и время, установка текущей даты и времени
oled.clear();
DateTime now = rtc.getTime();
int8_t sec = now.second; int8_t minu = now.minute; int8_t chas = now.hour; int8_t den = now.date; int8_t mes = now.month; int16_t god = now.year;
int8_t fmesto = 0; bool save = 0;
while (1) {
provBudil(); //проверка исполнения таймеров
saveAccum(); //проверка сохранения жизни аккумулятора панели и переключение при низком заряде на сеть 220В
peredacha ();
ammetr();
if (ok.isHolded()) { //при удержании кнопки ок выход с сохранением если настройка времени в сохраняется или без сохранения
if (save) {
rtc.setTime(sec, minu, chas, den, mes, god);
oled.clear();
return;
} else {
oled.clear();
return;
}
}
if (ok.isClick()) { // при клике ок меняется что будет изменяться
fmesto++;
}
if (fmesto >= 6) { //при клике ок на последнем настраиваемом пункте возвращается на первый
fmesto = 0;
}
if (up.isClick() or up.isHold()) { // клик или удержание кнопки вверх увеличивает значение с проверкой предотвращающей неправильные значения
switch (fmesto) {
case 0: {
chas++;
if (chas >= 24) {
chas = 0;
};
break;
}
case 1: {
minu++;
if (minu >= 60) {
minu = 0;
};
break;
}
case 2: {
den++;
if (den >= provdate(mes, god) + 1) {
den = 1;
};
break;
}
case 3: {
mes++;
if (mes >= 13) {
mes = 1;
};
break;
}
case 4: {
god++;
if (god >= 2101) {
god = 2020;
};
break;
}
case 5: {
save = !save;
break;
}
}
}
if (down.isClick() or down.isHold()) { // клик или удержание кнопки вниз уменьшает значение значение с проверкой предотвращающей неправильные значения
switch (fmesto) {
case 0: {
if (chas == 0) {
chas = 23;
} else {
chas--;
} break;
}
case 1: {
if (minu == 0) {
minu = 59;
} else {
minu--;
} break;
}
case 2: {
if (den == 1) {
den = provdate(mes, god);
} else {
den--;
} break;
}
case 3: {
if (mes == 1) {
mes = 12;
} else {
mes--;
} break;
}
case 4: {
god--;
if (god <= 2020) {
god = 2101;
};
break;
}
case 5: {
save = !save;
break;
}
}
}
// oled.clear(); // далее до конца функции код вывода инфы на дисплей
oled.home();
oled.println(F(" установка времени"));
oled.setCursor (7, 2);
if (fmesto == 0) oled.invertText(true);
if (chas < 10) oled.print(F("0"));
oled.print(chas);
oled.invertText(false);
oled.print(F(":"));
if (fmesto == 1) oled.invertText(true);
if (minu < 10) oled.print(F("0"));
oled.print(minu);
oled.invertText(false);
oled.print(F(":"));
if (sec < 10)oled.print(F("0"));
oled.print(sec);
oled.setCursor (2, 4);
if (fmesto == 2) oled.invertText(true);
oled.print(den);
oled.invertText(false);
oled.print(F(" "));
if (fmesto == 3) oled.invertText(true);
printFromPGM(&mesyac[mes - 1]);
oled.invertText(false);
oled.print(F(" "));
if (fmesto == 4) oled.invertText(true);
oled.print(god);
oled.invertText(false);
oled.print(F("г."));
if (fmesto == 5) oled.invertText(true);
if (save) {
oled.setCursor(5, 6);
oled.print(F("Сохранить"));
} else {
oled.setCursor(4, 6);
oled.print(F("не сохранять"));
}
oled.invertText(false);
oled.update();
}
}