Code Monkey home page Code Monkey logo

gyverlibs's People

Contributors

0purple avatar alexgyver avatar dan-sazonov avatar linotex avatar misha-plus avatar siliverst avatar tamtakoe avatar tesanti avatar vitsh7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gyverlibs's Issues

GyverEncoder / Через раз неверно определяется направление вращения энкодера

У меня энкодеры 2го типа (6.5мм).
Припаяны проводами к ардуине на пины с прерываниями. tick() повешан на прерывания. (Без прерываний та же проблема) (Пробовал 2 энкодера).
При вращении код через раз неправильно определяет направление вращения.
После замены https://github.com/AlexGyver/GyverLibs/blob/master/GyverEncoder/GyverEncoder.cpp#L181

uint32_t thisMls = millis();

На

uint32_t thisMls = micros();

И https://github.com/AlexGyver/GyverLibs/blob/master/GyverEncoder/GyverEncoder.h#L63

#define ENC_DEBOUNCE_TURN 1

На

#define ENC_DEBOUNCE_TURN 10

Всё заработало. Нужно очень быстро крутануть по часовой стрелке, чтоб направление определилось неправильно. Против часовой стрелки вообще работает идеально.
Остались проблемы с количеством - вместо 10 срабатываний иногда регистрирует 8-11.
Возможно у меня совсем палёные энкодеры. Но было бы неплохо переделать на микросекунды для таких энкодеров.

Несколько замечаний

Отличная библиотека! Стоит развивать дальше.

По поводу RTOS

  1. Переменную mainTimer стоит переименовать в gMillis (g - Gyver или Global) или, в крайнем случае, в mainTimerMs. Суть в том, что имя переменной должно подсказывать в каком формате хранятся в ней данные.

  2. Если buf это время до ближайшей задачи, то можно сделать его типом int. Ну и переименовать в что-то более понятное. Например nextTaskMillis или nextTaskTimeMs

  3. Насколько понимаю, расширенный режим нужен лишь для настройки энергосбережения.

myRTOS.tick(&buf);
LowPower.powerDown(SLEEP_PERIOD, ADC_OFF, BOD_OFF);
myRTOS.wake(&buf, &mainTimer);

Думаю, лучше использовать коллбэк, в котором пользователь реализует нужный ему режим

myRTOS.tickAndSleep(&buf, &mainTimer, powerModeSetter);

// Если в ардуиновском Си есть перегрузка или опциональные аргументы:
myRTOS.tickAndSleep(&buf, &mainTimer, SLEEP_PERIOD, powerModeSetter);
myRTOS.tickAndSleep(&buf, &mainTimer, SLEEP_PERIOD, ADC_OFF, BOD_OFF);

// Если нет:
myRTOS.tickAndSleepLowPower(&buf, &mainTimer, SLEEP_PERIOD, ADC_OFF, BOD_OFF);
myRTOS.tickAndSleepCustom(&buf, &mainTimer, SLEEP_PERIOD, powerModeSetter);
  1. Опять же не очень понятно, зачем каждый раз передавать &buf, &mainTimer в GRTOS и GTask. Логично сохранить эти указатели один раз при инициализации. Тогда код ещё упростится.
myRTOS.tickAndSleep()
// или просто
myRTOS.tick()
  1. buf и mainTimer можно сделать опциональными и сохранять по умолчанию в регистр общего назначения (они есть почти у любого МК)

  2. Подумать по поводу вызова задачи по прерыванию, чтобы не было сбоев из-за этого

  3. Прикрепление задач к общей задаче, а потом вкладывание её в лист кажется несколько избыточным. Могло бы быть как-то так

#include "GyverRTOS.h"

GRTOS myRTOS;
Gtask task3;

// Если setPeriod не задан, или у какой либо задачи таймаут будет меньше
// минимального WatchDog периода, то режим энергосбережения не применяется.
// Задачи, добавленные без параметров, выполняются с нулевой задержкой по кругу 
// как в многозадачной ОС.
void setup() {
  myRTOS.setPeriod(SLEEP_15MS);
  myRTOS.addTask(action1);
  myRTOS.addTask(action2); 
  myRTOS.addTask(action3, 1000);
}

void action1() {
  Serial.println("action1!");
}
void action2() {
  Serial.println("action2!");
}
void action3() {
  myRTOS.removeTask(action3);
}

void loop() {  
  myRTOS.tick();
}

В общем, если доработать, то будет очень полезной штукой

Не правильно работает метод GLinear::compute в библиотеке GyverFilters

Переменные sumX, sumY, sumX2, sumXY В классе GLinear не ресетятся в функции GLinear::compute из за чего при её повторном (многократном) вызове результат неверный.

Нужно в файл GyverFilters/GyverFilters.cpp в метод GLinear::compute после:
arrSize /= sizeof(int);

добавить:

sumX = 0;
sumY = 0;
sumX2 = 0;
sumXY = 0;

Compiling error MicroLED Matrix

In file included from C:\Users\Derdek\Documents\Arduino\libraries\microLED/microLED.h:40:0,
from lab_2.ino:1:
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:43:18: error: variable or field 'WS2812B_sendData' declared void
#define PTR_TYPE uint8_t*
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:24: note: in expansion of macro 'PTR_TYPE'
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:43:18: error: 'uint8_t' was not declared in this scope
#define PTR_TYPE uint8_t

^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:24: note: in expansion of macro 'PTR_TYPE'
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:33: error: 'data' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:39: error: 'int16_t' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:55: error: 'uint8_t' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:71: error: 'uint8_t' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:80: error: 'port' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:86: error: 'uint8_t' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:95: error: 'portreg' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
C:\Users\Derdek\Documents\Arduino\libraries\microLED/ws2812_send.h:47:104: error: 'uint8_t' was not declared in this scope
void WS2812B_sendData (PTR_TYPE data, int16_t datlen, uint8_t maskhi, uint8_t *port, uint8_t *portreg, uint8_t bright) {
^
Ошибка компиляции.

TM1637. Не управляются точки на дисплее.

Суть проблемы : - Заменил дисплей с ":" по середине на дисплей с Десятичными точками.

  • Обнаружил, что точки не управляются.
    Просьба к авторам библиотеки рассмотреть проблему и добавить/расширить функции библиотеки.

Ниже привожу быстрое решение, которое из-за лимита времени применил. Оно справедливо только для функции point() и display().
Подчеркиваю, что с огромным уважение отношусь к авторам библиотеке и позволил себе внести изменения только из-за крайнего цейтнота.
(в файлах библиотеки отмечены строки, в которых произведены изменения).

Пример (все как для Оригинальной библиотеки + небольшие изменения):

#include <GorTM1637.h>

#define CLK A5 //pin-ы для TM1637
#define DIO A4

GorTM1637 disp(CLK, DIO);

void setup()
{
disp.clear(); // инициализация TM1637
disp.brightness(7); // ярк, 0 - 7 (минимум - максимум)
}

void loop()
{
disp.point(POINT_ON,2); // ТОЧКУ поставим во 2-ю поз. ( слева направо, начиная с нуля)

disp.displayInt(301); // получим па дисплее 30.1

delay(2000);

disp.point(POINT_OFF,2); // погасить точку (если надо)
disp.displayInt(103); // получим па дисплее 103

delay(2000);

}

Библиотека с модификациями в посте здесь https://community.alexgyver.ru/threads/biblioteka-dlja-tm1637-s-desjatichnoj-tochkoj.2249/

Ошибки компиляции

D:\Arduino\libraries\GyverPower\GyverPower.cpp: In member function 'uint8_t GyverPower::sleepDelay(uint32_t)': D:\Arduino\libraries\GyverPower\GyverPower.cpp:159:11: error: invalid conversion from 'uint8_t {aka unsigned char}' to 'sleepprds_t' [-fpermissive] sleep(i); // уйти в сон

GyverTimer012

Dear Alex.
In the example to the library, only Timer1 is used.
Have you checked Timer2 and Timer0.
For some reason, only Timer1 works for me.

Request placed on your forum
https://community.alexgyver.ru/threads/problema-v-ispolzovanii-biblioteki-gyvertimer012.2166/

Look here please.
Teska.

Уважаемый, Алекс.
В примере к библеотеке использован только Timer1.
Проверяли ли Вы Timer2 and Timer0.
У меня почему то работает только Timer1.

Запрос поместил на Вашем форуме
https://community.alexgyver.ru/threads/problema-v-ispolzovanii-biblioteki-gyvertimer012.2166/

Посмотрите пожалуйста.
Теска.

Нельзя одновременно подключить GyverTimer и GyverHacks

В обеих библиотеках объявляется класс GTimer.
Я попробовал удалил объявление класса и его тело из в библиотеки GyverHacks т.к. судя по коду в GyverHacks это класс нигде не используется.
Все собралось, но возникла проблема с таймерами в GyverTimer после вызова anyPWMinit они перестают работать.

Конфликт имен

Замени, пожалуйста, следующие имена (в ServoSmooth, мб еще где-то) на более уникальные, т.к. возникают конфликты.

#define NORMAL 0
#define REVERSE 1 

Конфликт GyverTimes с TFT Дисплеем на базе ST7735

День добрый. Обнаружил конфликт при совместном использовании библиотеки прерываний по таймеру GyverTimers и TFT дисплея на базе ST7735. При активации канала прерываний прекращается отображение графических примитивов на дисплее (скетч ниже).
Используется arduino nano и tft oled дисплей 1.8 на ST7735.

#include <Adafruit_GFX.h> // Библиотека для вывода графических примитивов на дисплей
#include <Adafruit_ST7735.h> // Библиотека драйвера дисплея

#include "GyverTimers.h" // Библиотека для работы с прерываниями по таймеру


#define TFT_CS        7
#define TFT_RST        6 
#define TFT_DC         8

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup() 
{
  tft.initR(INITR_BLACKTAB);
  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);

  Timer1.setPeriod(40);     // Устанавливаем период таймера 
  Timer1.enableISR(); // Если закомментировать эту строку то квадрат рисуется на экране, иначе - экран залит цветом заднего фона, квадрат не рисуется!
  Timer1.stop();
}

void loop() {
  tft.fillRect(10,10,150,118,ST7735_YELLOW); // Рисуем прямоугольник заполненный желтым цветом

}

GyverButton (и не только) оптимизация

Хочу предложить небольшую оптимизацию проверки нажатия.
Каждый раз в цикле проверяется разность во времени, но можно таймаут заранее прибавлять к переменной mills() и сравнивать текущее значение mills() со значением в будущем, если текущее больше, то таймаут прошел.
Таким образом избавляемся от арифметической операции каждый тик и только сравниваем два числа.

// обработка накликивания
	if ((thisMls - btn_timer >= _click_timeout) && (btn_counter != 0)) {    
		last_counter = btn_counter;
		btn_counter = 0;
		flags.counter_flag = true;
	}

Можно присваивать везде btn_timer = thisMls + _click_timeout
А потом проверять условие
thisMls >= btn_timer

Button.isPress() отрабатывает при запуске

Здравствуйте. У меня возникла проблема с использованием библиотеки GyverButton.

Дело в том, что при запуске ардуины почему-то отрабатывает одно нажатие на кнопку (isPress()).

Поскольку я новичок в этом деле, то не понимаю - это мой косяк или же ошибка в работе библиотеки.

Вот мои тесты:

Тест 1

Использую код с сайта, без изменений:

/*
   Данный код демонстрирует переключение режимов работы при помощи кнопки
   Для удобства используется библиотека отработки нажатий кнопки
   В этом варианте примера функции "режимов" вызываются только один раз
*/
#define PIN 3        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define MODE_AM 5    // количество режимов (от 0 до указанного)
#include "GyverButton.h"
// моя библиотека для более удобной работы с кнопкой
// скачать мождно здесь https://github.com/AlexGyver/GyverLibs
GButton butt1(PIN);  // создаём нашу "кнопку"
byte mode = 0;       // переменная режима
void setup() {
  Serial.begin(9600);
}
void loop() {
  butt1.tick();             // обязательная функция отработки. Должна постоянно опрашиваться
  if (butt1.isPress()) {    // правильная отработка нажатия с защитой от дребезга
    // увеличиваем переменную номера режма. Если вышла за количество режимов - обнуляем
    if (++mode >= MODE_AM) mode = 0;
    // всё переключение в итоге сводится к оператору switch
    // переключение и вызов происходит только при нажатии!!!
    switch (mode) {
      case 0: task_0();
        break;
      case 1: task_1();
        break;
      case 2: task_2();
        break;
      case 3: task_3();
        break;
      case 4: task_4();
        break;
    }
  }
}
// наши задачи, внутри функций понятное дело может быть всё что угодно
void task_0() {
  Serial.println("Task 0");
}
void task_1() {
  Serial.println("Task 1");
}
void task_2() {
  Serial.println("Task 2");
}
void task_3() {
  Serial.println("Task 3");
}
void task_4() {
  Serial.println("Task 4");
}

После старта в порт сразу приходит "Task 1", хотя на кнопку я ещё даже не нажимал.
controlling led by button_bb

Тест 2

Пробую переключать светодиоды. при mode=0 зеленый, иначе красный

#include "GyverButton.h"

const int goodPin = 8;
const int badPin = 7;
const int buttonPin = 3;

GButton button(buttonPin);
int mode = 0;

void setup()
{
   pinMode(goodPin,OUTPUT);
   pinMode(badPin,OUTPUT);
} 

void loop()
{
  button.tick();
  if (button.isPress()) {
    mode++;
  }
  if (mode == 0)
  {
    digitalWrite(badPin,LOW);
    digitalWrite(goodPin,HIGH);
  }
  else
    digitalWrite(badPin,HIGH);
    digitalWrite(goodPin,LOW);
}

controlling led by button_bb2

На видео видно, что на долю секунды зажигается зеленый светодиод, но потом отрабатывает блок if (button.isPress()), и режим меняется на 1 (красный светодиод).
Видео работы

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

Прошу прощения за некрасивые схемы и сборку - я только недавно начал осваивать всё это дело.

PIDtuner2.h - несоответствие описания фактическим параметрам

Выдержки из файла:
В скобках 7 (семь) параметров, дано описание 6-ти

1.Инициализация и настройка

    PIDtuner tuner;
    tuner.setParameters(направление, начальный сигнал, конечный сигнал, период, точность, время стабилизации, период итерации)

    1.1 Направление:
        - NORMAL: увеличение выходного сигнала увеличивает сигнал с датчика (например обогреватель, мотор)
        - REVERSE: увеличение выходного сигнала уменьшает сигнал с датчика (например холодильник, тормоз)
    1.2 Начальный сигнал: стартовый сигнал на управляющее устройство
    1.3 Конечный сигнал: конечный сигнал на управляющее устройство
    1.4 Период: период опроса в ожидании стабилизации
    1.5 Точность стабилизации: скорость изменения значения с датчика, ниже которой система будет считаться стабильной
    1.6 Период итерации: dt системы в миллисекундах, желательно должно совпадать с периодом ПИД регулятора

И далее, уже в коде имеем тоже 6 параметров

class PIDtuner2
{
    public:
    void setParameters(bool newDirection, int newStart, int newEnd, int newWait, float newWindow, int newPeriod)

GyverUART

  1. Глобальные переменные торчат наружу, это может вызвать конфликты, или привести с побочному-использованию.

  2. Реализация приема реализована крайне не плохо:

    • никак не проверяется граница буфера, это значит, что если пользователь по каким-
      то причинам не вычитает буфер _UART_RX_BUFFER, а прием не прекратится, то счетчик
      может выйдет за границы буфера и начнется перезапись чужих данных.
  • Реализация uartRead со смещением всего буфера - крайне не оптимальное решение.
  1. uint32_t integer = data;
    uint32_t fract = ((float)data - integer) * 1000000000;
    тип uint32_t не может в себя вместить число больше чем 2^32 - 1, что выдаст не верный результат при достаточно больших значениях data. В оригинальный код arduino учитывает этот нюанс (хотя и довольно топорно, но все же). Реализация поддержки преобразования float в строку от Atmel достаточно весомая (не зря по умолчанию она отключена, и её нужно добавлять руками), но, тем не менее, делает это корректно.

GButton

Здравствуйте, у меня возникла проблема. Где-то пол года назад я решил повторить проект Алекса огненная лента на адреске, потом решил немного дописать код для управления цветом и яркостью с помощью сенсорной кнопки ttp223. Всё было окей но потом возникли проблемы и скетч был утерян. Решил переписать и сейчас столкнулся с проблемой. При вызове isSingle(), true возвращалось только после двойного нажатия, для isDouble() нужно тройное нажатие и т.д. Когда загрузил пример Gbutton_demo, в мониторе порта постоянно выводилось :
Holding
Holding
Holding...
При использовании самого обычного кода для вывода значения кнопки всё работает правильно. Но при использовании GButton кнопка постоянно зажата. При использовании обычной кнопки проблема та же.
Надеюсь на вашу помощь!

Проблема с digitalRead когда включена LED строка

Библиотека microLED

Проблема - после вызова strip.show(), все пини которым было сделано INPUT_PULLUP возвращают нуль (нажатое состояние), даже если к LED не было подключено питание.

Маркировка на LED - 8-Bit 2812 RGB
Arduino Nano
Версия библиотеки microLED - 3.2

Спасибо за помощь

Пример скетча

`#include "microLED.h"

#define stripPin 3

bool isLed = false;

microLED<8, stripPin, MLED_NO_CLOCK, LED_WS2812, ORDER_GRB> strip;

void setup() {
Serial.begin(9600);

pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);

}

void loop() {

if(digitalRead(5) == 0 && !isLed) {
strip.fill(mRed);
strip.show();
isLed = true;
} else if(digitalRead(5) == 0 && isLed) {
strip.clear();
strip.show();
isLed = false;
}

Serial.print("digitalRead(2) ");
Serial.println(digitalRead(2));//до вызова strip.show() - 1 если не нажата кнопка, 0 если нажата кнопка, после strip.show() всегда 0
Serial.print("digitalRead(4) ");
Serial.println(digitalRead(4));//до вызова strip.show() - 1 если не нажата кнопка, 0 если нажата кнопка, после strip.show() всегда 0
Serial.print("digitalRead(5) ");
Serial.println(digitalRead(5));//до вызова strip.show() - 1 если не нажата кнопка, 0 если нажата кнопка, после strip.show() всегда 0
Serial.print("digitalRead(6) ");
Serial.println(digitalRead(6));//до вызова strip.show() - 1 если не нажата кнопка, 0 если нажата кнопка, после strip.show() всегда 0
delay(1000);
}`

GyverEncoder

Алекс здравствуйте,
GyverEncoder,
проблема:
ESP32+TFT ILI9488 IDE 1.8.13
в скетче есть 3 экрана
1-играет интернет-радио
2- FM
3- CD
в которых проверяю enc.isSingle() и если есть нажатие выхожу
на главный экран.
в скетче это в одной функции, enc1.tick() затем проверяю, если
экран 1 и enc.isSingle(), то выход и т.д. 2,3
проблема есть, только на 3 экране, при выходе на главный экран,
при следующем опросе enc1.tick(), срабатывает снова enc.isSingle(),
хотя флаг сбросился.
Поместил сразу после всех enc.isSingle() опрос флагов,
на 2 нормальных всегда Press+Release, а на проблемном, только Press.
Пробовал менять #define ENC_DEBOUNCE_BUTTON,
ставить после enc.isSingle() resetStates, с прерыванием и без,не помогло.
Даже не знаю в какую сторону смотреть, тк все обработчики одинаковые,
подскажите, может есть решение.
Заранее спасибо, и отдельно за отличные библиотеки.
PS
было бы здорово добавить флаг наличия действия с энкодером, чтобы не проверять
флаги по очереди,а сразу выйти,
а на isHold добавить поле время удержания, чтобы без костылей обходиться.

Плохая совместимость библиотек microLED и gyverButton

При совместном использовании ломается логика выходов и входов. Для ws2812 на пине дата происходит подтяжка к земле, что приводит к течению тока с пина vcc на пин дата, можно отключить землю и все равно светодиоды будут светить. Происходит это только при вызове метода show(). В свою очередь появляются ложные срабатывания на кнопках, которые подключены к земле и подтянуты к Vcc. Если функционал microLED заменить на fastLED, то проблемы с кнопками нет. Но microLED намного практичнее и удобнее fastLED, и очень хорошо документирована. Есть ещё, как минимум один человек, который столкнулся с аналогичной проблемой. Очень ждём исправлений.

При компиляции в Eclipse, возникает ошибка GyverFilters.cpp:29:1: error: control reaches end of non-void function [-Werror=return-type]

При компиляции в Eclipse, возникает ошибка GyverFilters.cpp:29:1: error: control reaches end of non-void function [-Werror=return-type]

Насколько я понимаю, это из за того, что функция GFilterRA::filteredTime возвращает значение только после того как пройдет заданное время....

Ошибка экспорта в create.arduino.cc

Проблема

При попытке загрузки библиотек в облачный редактор Arduino-скетчей вылетает следующая ошибка:

Libraries that could not be uploaded:

[] library.properties not found

Причина в отсутствии файла library.properties, подробности описаны в соответствующем форуму.

Возможное решение

Добавить в каждую библиотеку файл library.properties с соответствующей схемой данных: https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5:-Library-specification#libraryproperties-file-format

Шаблон файла:

name=Gyver____
version=___
author=AlexGyver <[email protected]>
maintainer=AlexGyver <[email protected]>
sentence=____
paragraph=___
category=___
url=https://github.com/AlexGyver/GyverLibs/tree/master/___
architectures=*

Неожиданное поведение методов isPress и isRelease при зажатии кнопки энкодера.

Вот такой код

  if (enc1.isPress()) {           // Если кнопку нажали.
    digitalWrite(swich, 0);
  }
  if (enc1.isRelease()) {         // Если кнопку отпустили. Таким способом хоть зажимай кнопку, хоть кликай, это должно бы повторять действия пользователя.
    digitalWrite(swich, 1);
  }

работает неожиданно, а точнее как тригер, если кнопку нажимать не кратко, а зажать.
При этом короткие нажатия отрабатываются как надо. Похоже методы isPress и isRelease перестают работать должным образом, когда истекает таймаут для isHolded. Сами же методы isHold и isHolded в данной задаче не применимы, контроллер просто должен повторять действия пользователя. Или я чего-то не понял?
Может ли быть заменой digitalWrite(swich, !enc1.isHold);

Double, triple (and more) click is always set single click flag.

Version: 2.14 (09-sep-2019)
Double, triple (and more) click is always set single click flag.
Double, triple (and more) click always includes single click. For example, after double clicking both functions isDouble() and isClick() will return true.

Двойное и более нажатие всегда подразумевает и одинарное. Т. е. при, например, двойном нажатии кнопки, обе функции isClick() и isDouble() вернут true.

Убрать обработку кнопки из класса энкодера

Алекс, привет.

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

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

Тем более, что не все энкодеры идут с кнопкой.

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

Объекты медианного фильтра имеют общие переменные

Я использую медианный фильтр и создаю два отдельных объекта что бы фильтровать две отдельные переменные. Но переменные преравниваются одна к другой.

Вот так я объявил два объекта:

#include "GyverFilters.h"
GMedian medianFilter1;
GMedian medianFilter2;

Вот так я фильтрую переменные:

if (json_key_buf == "vgi") {

      int16_t date1 = current_date;
      date1 = medianFilter1.filtered(date1);
      jsonWriteInt(inv001, json_key_buf, date1);

    } else if (json_key_buf == "vi") {

      int16_t date2 = current_date;
      date2 = medianFilter2.filtered(date2);
      jsonWriteInt(inv001, json_key_buf, date2);

    } else {
      jsonWriteInt(inv001, json_key_buf, current_date);
    }

На выходе я получаю объединение величин date1 и date2

Точнее date2 равна date1 постоянно.

Благодарю Вас за библиотеки и за Ваш сайт.

GyverButtons

Version: 2.14 (09-sep-2019)
Holding a button resets variable "last_counter", thereby reseting isSingle, isDouble, isTriple and other (last_counter).
Баг или фича: принцип работы библиотеки такой, что различные нажатия кнопок сбрасываются только после вызова опрашивающей функции (isClick, isHolded...).
Но isSingle, isDouble and isTriple и остальные (last_counter) можно сбросить, если удерживать кнопку (hold).
Баг бага или баг фичи: такой сброс последовательности нажатий удержанием кнопки не сбрасывает флаг counter_flag.

GyverEncoder. метод isHolded не сбрасывает флаг isRelease_f

метод isHolded не сбрасывает флаг isRelease_f
вследствии чего, если сделать клик и не обработать его, то метод isClick вернёт true при следующем вызове.
Код для проверки:

//сделать клик, подождать секунду, зажать кнопку
if(enc1.isHolded())
{
    //после зажатия кнопки ничего не делаем
    if(enc1.isClick())// всё равно вернёт true
    {
          //этот код вызовится сразу же
    }
}

Не хватает функции в GyverButton

А конкретно функции, которая бы чистила все буфера butt.tick(); о захвате нажатия, а то в не зависимости нужно слушать в данный момент остальные кнопки помимо тех которые нужно, tick все запоминает в буфер а потом делает ложное срабатывание, когда остальным кнопкам уже разрешено реагировать, но ты еще ничего не нажимал. Пример с постраничным меню дисплея, на каждой странице разрешено читать свои кнопки, а не все сразу и писать в буфер что они тоже были нажаты - прочитал butt.isClick(); и сразу все буфера clear а еще лучше выбранные буфера.

Определение цвета PINK конфликтует с макросом PINK в Меге2560 в microLED

В Меге2560 PINK это указатель на регистр настройки одного из портов
изображение

Его определение конфликтует с определением цвета PINK в microLED.h:113, из-за чего скетчи под Мегу не компилируются.

Как вариант переименовать цвет, допустим, в MAGENTA, как он и называется по мнению википедии
изображение

Ошибка в порядке цветов в microLed

Тестирую:
2812b, GRB порядок, 1 байт - нормально, красный - красный, и т.д.
2813 - параметры не меняю: красный - красный, а зеленый и синий перепутаны местами.

2813, 1 байт, что логично - переключаю на BRG, чтобы поменять зеленый и синий на места.
В результате вместо красного - зеленый, вместо зеленого - синий, вместо синего - красный!

Почесав в затылке - меняю на GBR раскладку - там норм выходит.

И вот сидишь и думаешь: в чем тогда косяк, если при перемене цветов вот такая фигня получается-то?!

Может ли библиотека GyverButton отслеживать такой тип сигнала?

Добрый день.
У меня вопрос по библиотеке GyverButton. Хочу повесит вместо кнопки на пин сигнал с аппаратуры радиоуправления RadioLink RC6GS. На самой аппаратуре есть кнопка без фиксации. Хочу сделать чтобы при нажатии на кнопку аппаратуры сигнал от приемника приходил на контроллер, а библиотека могла бы распознавать сколько нажатий было сделано и соответственно включать разные функции (тоесть далее работала как обычно).
Сигнал с приемника аппаратуры я могу отслеживать и выводить в монитор порта следующим образом:

ppm_str = pulseIn (PIN, HIGH);
Serial.println(ppm_str);

Этот сигнал выдается в порт числами от 1000 до 2000. Когда кнопка не нажата - 1000, если нажата - 2000.
Вопрос: можно ли как-то сделать, чтобы библиотека принимала и распознавала такой сигнал? Может его надо как-то преобразовать, чтобы библиотека считала это нажатием простой физической кнопки.
Буду очень признателен за помощь.

Добавить бы метод проверки состояния в GTimer

Часто использую таймеры как функцию setTimeout в js, только в данном случае приходится в мэйн функции останавливать таймер методом .stop(), и в момент нужного события, например if (button.isSingle()) запускать timer.setTimeout(ms); timer.start(); и в if (timer.isReady()) опять останавливать таймер. Не сказал бы, что прям очень удобно, но удобней пока не было придумано, а у самого пока от идеи только недовольство) В целом такой метод меня устраивает, но хотелось бы его усовершенствовать добавлением метода timer.isEnabled(). Сделай, пожалуйста.

Лента жарит яки чёрт

Atmega 32u4 (Pro Micro), полёт нормальный, но есть, как говорится, один нюанс. setMaxCurrent не работает. Ток стоит 500 мА -1А, лента выжигает глаза буквально, в FastLED при ограничении в 1А она еле светила
image
image
(Через камеру не передашь, естественно)

uart.write does not work, but works when change to uart.println

Hi Alex,

I have setup your core and used uart lib instead of Serial.
Below is the code, it is quite straight-forward. I get analog input through interupt and send it to UART (uart.write). It does send nothing (in monitor). But when I change it to uart.println - it works.
Serial.write works. Baud rate does not change anything.
Any ideas?

Thanks, Eugene

#define switch1 4
#define switch2 3

boolean sw1, sw2, lsw1, lsw2;
uint8_t v0, v1;
uint16_t lastADC, val;
boolean adcf = false;
uint8_t dv1 = 1, dv2 = 1;
uint8_t pos = 0;

void setup() {
pinMode(switch1, INPUT);
digitalWrite(switch1, HIGH); // enable internal pullup
pinMode(switch2, INPUT);
digitalWrite(switch2, HIGH);
ADMUX = B00000000; // set external aref and port
// ADMUX = B01000000; // выбор внутреннего опорного напряжения (Vcc - 5V) и порта 5 (A0)
ADCSRA = B10101011; // ADC enable, interrupt enable, set default prescaler
ADCSRB = B00000000; // free running mode
sei(); // enable interrupts
ADCSRA |=B01000000; // start first conversion
uart.begin(1000000);
lsw1 = digitalRead(switch1);
lsw2 = digitalRead(switch2);
sw1 = lsw1;
sw2 = lsw2;
if ( ( sw1 ) && ( !sw2 ) ) { dv1 = 1; dv2 = 2; }
else if ( ( !sw1 ) && ( sw2 ) ) { dv1 = 5; dv2 = 6; }
else if ( ( !sw1 ) && ( !sw2 ) ) { dv1 = 1; dv2 = 4; }
else { dv1 = 1; dv2 = 1; }
}

void loop() {
if ( adcf ) {
cli();
val = lastADC;
adcf = false;
sei();
switch ( dv2 ) {
case 1 : v0 = val; break;
case 4 : v0 = val >> 2; break;
case 2 : v0 = val >> 1; break;
case 6 : v0 = val * dv1 / dv2;
}
pos = pos + 1;
switch ( pos ) {
case 1 : v1 = v0 >> 4; break;
case 2 : v1 = v1 | (v0 & B11110000); break;
case 3 : uart.write(v1); pos = 0; break;
}
}
}

ISR(ADC_vect) {
lastADC = ADC;
adcf = true;
}

Проблема с

Проблема с энкодером.
Если просто кликать на кнопку то

  1. не все нажатия отрабатываются.
  2. ложное Holded (кнопка быстро отпускается)
  3. Press-Holded просто чередуется. Хотя по факту были только нажатия
    Подключен не через прерывания.
    #define CLK 7
    #define DT 8
    #define SW 10
    Encoder enc1(CLK, DT, SW);

Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press
Holded
Press

Неопределённое поведение в функциях `timer0_setPeriod` и `timer2_setPeriod`

Рассмотрим параметры time функций timer0_setPeriod и timer2_setPeriod. Так как каскад if-else... не обрабатывает все возможные значения аргумента time (пример из timer0_setPeriod):

if (time > 1 && time <= 16) {
    divisor = 1;
    divValue = 1;
} else if (time > 16 && time <= 128) {
    divisor = 8;
    divValue = 2;
} else if (time > 128 && time <= 1024) {
    divisor = 32;
    divValue = 3;
} else if (time > 1024 && time <= 4096) {
    divisor = 64;
    divValue = 4;
} else if (time > 4096 && time <= 16384) {
    divisor = 128;
    divValue = 5;
} else TCCR0B = 1;

то для любых значений time больше 16384 на следующей строке произойдёт чтение не инициализированной переменной divisor:

period = (long)16 * time / divisor - 1; // COMPA

и
isr2_counter = 256 - (long)16 * time / divisor; // OVF

P.S. Изменение типа параметра на uint16_t нарушит обратную совместимость.

TM1637 with 6-digits display from RobotDyn

Купил 6-разрядный дисплей RobotDyn (https://robotdyn.com/catalog/displays/6-digit-led-display-tube-7-segments-76x19mm-tm1637.html)
Родной библиотеки нет. Вообще, ни с одной из найденных библиотек не работает корректно - вместо 6 цифр выводятся только 4, причем в странном порядке: вместо "123456" выводится "321хх4" (х - это пустое место). Т.е. первый (слева) разряд выводится в 3-е знакоместо, второй разряд выводится во 2-е знакоместо, третий разряд выводится в 1-е знакоместо, 4-й разряд выводится в 6-е знакоместо, а 5й и 6й разряд не выводятся вообще.
Схема на этот дисплей: ссылка
По даташиту поддержка 6 разрядов есть, но ни в одной библиотеке не реализована.
Так как библиотека GyverTM1637 - одна из самых удобных и функциональных, вопрос - будет ли в новых версиях поддержка этого дисплея?

Не содержит корректных библиотек

Добрый день, библиотеки никак не устанавливаются в IDE, уже не первый раз и не только с Вашей библиотекой, вероятно новый IDE и Win 10 имеют особенности или только мне так повезло?

Структура репозитория

Много полезных библиотек, проделана большая работа, но зачем они свалены в кучу в одном репозитории? Это не просто противоречит принципу git но и делает крайне неудобным использование и контрибуцию со стороны тех, кто может вносить изменения и создавать PRы
Например, мне в проекте понадобилась библиотека PID - зачем мне тянуть в проект еще полсотни? Как поучаствовать в доработке этой библиотеки, не ввязываясь в релизный цикл остальной полсотни?
Кто мешает сделать столько репозиториев сколько надо? Тем более, можно будет одной строкой подключать библиотеки в тот же проект на platformio
Ну и не надо пытаться реализовать всю логику внутри файла с расширением .h как это сделано в ряде библиотек. Можно и нужно имплементацию описывать в файлах .cpp

OLED(ssd1306) & MPU6050

При использовании библиотеки гироскопа не выводятся данные на дисплей.

GyverButton

AlexGyver, доброго времени суток, спасибо за библиотеке.
Есть небольшое предложение по библиотеке GyverButton.
Предположим, требуется задать задержку (setTimeout ),
скажем в 30 сек, при этом срабатывание 2х, 3х и т.д. кликов происходит
с такой же задержкой, что дико не удобно.
Предлагаю параметр setTimeout, разделить на 2 (setTimeout и setHoldTimeout).
Первый это время задержки нажатой кнопки, а второй,
время, после которого пачка кликов является завершённой.

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

джиттер в timerX_setPeriod

При установке нового значения периода, не учитывается текущее значение TCNTx. Таким образом в момент смены периода возможно получить импульс произвольной длительности. Критично например при управлении ШД - при разгоне будет срыв шагов.
Фикс предлагается например такой:
while(TCNT5 > (_timer5_top / 2));
ICR5 = _timer5_top - 1;
возможно есть решение получше
UPD: возможно проблема не в этом, а в не атомарном апдейте ICR регистра, надо покурить даташит.
UPD2: Accessing 16-bit Registers: для записи 16 битных регистров используется временный регистр, который шарится между всеми таймерами, поэтому настоятельно рекомендуется запрещать прерывания на момент апдйта ICRx

Поддержка BMP280 в библиотеке BME280

Если не трудно разрешите в либе использовать BMP вместо BME.

Собственно при проверке id разрешить значение 0х58. Адреса/формат регистров практические не меняются. Только отсутствуют регистры контроля и данных влажности.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.