ARDUINO Как в этот скетч добавить еще кнопок и чтобы все правильно работало (Диммер)

Full_noob

✩✩✩✩✩✩✩
21 Фев 2019
1
0
Здравствуйте, Господа.
На просторах интернета нашел необходимый мне скетч http://forum.amperka.ru/threads/Однокнопочный-диммер-на-arduino.8700/
Спасибо большое этому человеку.Идея в том чтобы сделать сенсорный выключатель на основе этого скетча. Вместо кнопки использовать ТТР223 и управлять светом так как показано в видео по ссылке выше. (тапнул 1 раз - свет включился, тапнул еще 1 раз - свет выключился, нажал и держишь, меняется яркость в одну сторону от 0 до максимума)

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

Вот изначальный код на 1 светодиод

#include "OneButton.h"

const int buttonPin = 2;
const int ledPin = 9;
const byte loga[64] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 22, 25, 28, 29, 30, 33, 36, 39, 42, 46,
49, 53, 56, 60, 64, 68, 72, 77, 81, 86, 90, 95, 100, 105, 110, 116, 121, 127, 132, 138, 144,
150, 156, 163, 169, 176, 182, 189, 196, 203, 210, 218, 225, 233, 240, 248, 255
};
int i = 1;

OneButton button(buttonPin, false);

int ledState = LOW;
int ledLevel = 0;

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);

button.attachClick(clickedIt);
button.attachDuringLongPress(duringLongPressIt);
}

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

void clickedIt() {
if (ledState == LOW) {
for (int i = 0; i < 63; i++) {
analogWrite(ledPin, loga);
delay(10);
}
ledState = !ledState;
}
else {
if (ledLevel > 0 ) {
for (int i = ledLevel; i >= 0; i--) {
analogWrite(ledPin, loga);
delay(10);
}
}
else {
for (int i = 63; i >= 0; i--) {
analogWrite(ledPin, loga);
delay(10);
}
}
ledState = !ledState;
ledLevel = 0;
}
}


void duringLongPressIt() {
analogWrite(ledPin, loga[ledLevel]);
ledLevel = ledLevel + 1;
if (ledLevel >= 63) {
ledLevel = 63;
}
delay(50);
ledState = HIGH;
}


А код который попытался наколхозить я. Банально конечно, но блин, пока так

#include "OneButton.h"

const int buttonPin1 = 2;
const int ledPin1 = 9;
const int buttonPin2 = 3;
const int ledPin2 = 10;
const byte loga[64] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 22, 25, 28, 29, 30, 33, 36, 39, 42, 46,
49, 53, 56, 60, 64, 68, 72, 77, 81, 86, 90, 95, 100, 105, 110, 116, 121, 127, 132, 138, 144,
150, 156, 163, 169, 176, 182, 189, 196, 203, 210, 218, 225, 233, 240, 248, 255
};


int i = 0;


OneButton button1(buttonPin1, false);
OneButton button2(buttonPin2, false);


int ledState1 = LOW;
int ledLevel1 = 0;
int ledState2 = LOW;
int ledLevel2 = 0;


void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin2, INPUT);


button1.attachClick(clickedIt1);
button1.attachDuringLongPress(duringLongPressIt1);
button2.attachClick(clickedIt2);
button2.attachDuringLongPress(duringLongPressIt2);
}


void loop() {
button1.tick();
button2.tick();
}


void clickedIt1() {
if (ledState1 == LOW) {
for (int i = 0; i < 63; i++) {
analogWrite(ledPin1, loga);
delay(10);
}
ledState1 = !ledState1;
}
else {
if (ledLevel1 > 0 ) {
for (int i = ledLevel1; i >= 0; i--) {
analogWrite(ledPin1, loga);
delay(10);
}
}
else {
for (int i = 63; i >= 0; i--) {
analogWrite(ledPin1, loga);
delay(10);
}
}
ledState1 = !ledState1;
ledLevel1 = 0;
}
}


void duringLongPressIt1() {
analogWrite(ledPin1, loga[ledLevel1]);
ledLevel1 = ledLevel1 + i;
if (ledLevel1 >= 63) {
ledLevel1 = 63;
}
delay(50);
ledState1 = HIGH;
}


void clickedIt2() {
if (ledState2 == LOW) {
for (int i = 0; i < 63; i++) {
analogWrite(ledPin2, loga);
delay(10);
}
ledState2 = !ledState2;
}
else {
if (ledLevel2 > 0 ) {
for (int i = ledLevel2; i >= 0; i--) {
analogWrite(ledPin2, loga);
delay(10);
}
}
else {
for (int i = 63; i >= 0; i--) {
analogWrite(ledPin2, loga);
delay(10);
}
}
ledState2 = !ledState2;
ledLevel2 = 0;
}
}


void duringLongPressIt2() {
analogWrite(ledPin2, loga[ledLevel2]);
ledLevel2 = ledLevel2 + i;
if (ledLevel2 >= 63) {
ledLevel2 = 63;
}
delay(50);
ledState2 = HIGH;
}


Со вторым кодом работает вообще непонятно как. Описать это тяжело, могу приложить видео
Вопрос в том как добавить 2 и более кнопок и светодиодов в этот код так чтобы они работали нормально
Подскажите кто может
 

DeVeLoPer_HiKiTa

✩✩✩✩✩✩✩
20 Фев 2019
3
5
сенсорная кнопка у меня одна

пробуй:

библиотека GyverButton

C++:
#include "GyverButton.h"

GButton butt1(2, LOW_PULL, NORM_OPEN);//подключена сенсорная кнопка
GButton butt2(4);//обычные
GButton butt3(7);

unsigned char valueled3 = 0;
unsigned char valueled5 = 0;
unsigned char valueled6 = 0;
bool stateled3 = 0;
bool stateled5 = 0;
bool stateled6 = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(3, OUTPUT);//светодиоды подключеные к шим
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop()
{
  butt1.tick();
  butt2.tick();
  butt3.tick();

  //1 кнопка
  if(butt1.isClick())
  {
    if(stateled3 ==  0)
    {
      if(valueled3 > 0)
      {
        analogWrite(3, valueled3);
        stateled3 = !stateled3;
      }
      else
      {
        digitalWrite(3, 1);
        stateled3 = !stateled3;
      }   
    }
    else
    {
      digitalWrite(3, 0);
      stateled3 = !stateled3;
    }
  }

  butt1.tick();
  while(butt1.isHold())
  {
    butt1.tick();
    for(unsigned char i = valueled3; i < 256; i = i+3)
    {
      butt1.tick();
      if(butt1.isRelease())
      {
        break;
      }
      valueled3 = i;
      analogWrite(3, valueled3);
      delay(50);
    }
    butt1.tick();
    stateled3 = 1;
    butt1.tick();
  }
 
  //2 кнопка
  if(butt2.isClick())
  {
    if(stateled5 ==  0)
    {
      if(valueled5 > 0)
      {
        analogWrite(5, valueled5);
        stateled5 = !stateled5;
      }
      else
      {
        digitalWrite(5, 1);
        stateled5 = !stateled5;
      }   
    }
    else
    {
      digitalWrite(5, 0);
      stateled5 = !stateled5;
    }
  }
 
  butt2.tick();
  while(butt2.isHold())
  {
    butt2.tick();
    for(unsigned char i = valueled5; i < 256; i = i+3)
    {
      butt2.tick();
      if(butt2.isRelease())
      {
        break;
      }
      valueled5 = i;
      analogWrite(5, valueled5);
      delay(50);
    }
    butt2.tick();
    stateled5 = 1;
    butt2.tick();
  }
 
  //3 кнопка
  if(butt3.isClick())
  {
    if(stateled6 ==  0)
    {
      if(valueled6 > 0)
      {
        analogWrite(6, valueled6);
        stateled6 = !stateled6;
      }
      else
      {
        digitalWrite(6, 1);
        stateled6 = !stateled6;
      }   
    }
    else
    {
      digitalWrite(6, 0);
      stateled6 = !stateled6;
    }
  }
 
  butt3.tick();
  while(butt3.isHold())
  {
    butt3.tick();
    for(unsigned char i = valueled6; i < 256; i = i+3)
    {
      butt3.tick();
      if(butt3.isRelease())
      {
        break;
      }
      valueled6 = i;
      analogWrite(6, valueled6);
      delay(50);
    }
    butt3.tick();
    stateled6 = 1;
    butt3.tick();
  }
 
}
 
  • Лойс +1
Реакции: РЕМ