Конечные автоматы, зажигание светодиода на определенное время

arlover
Offline
Зарегистрирован: 16.03.2019

Здравствуйте! Бьюсь вторую неделю, не могу реализовать следующую задачу:

Нажимаем кнопку - светодиод горит одну секунду. 
Нажимаем два - две секунды и тд. Если во время горения светодиода нажимаем кнопку, то добавляется еще время равное количеству нажатий. Методом конечных автоматов не смог сделать,  сделал проще. Все загорается, но когда начинаю нажимать на кнопку во время горения кнопки таймер может остановиться. В чем проблема так и не нашел.
Буду признателен, если хорошие и опытные люди помогут дилетанту :)

 

#include <SimpleTimer.h>
#define LED_PIN     13
#define BUTTON_PIN  7

SimpleTimer timer;
bool wasButtonDown = false;
int secCount = 0;

int timer1 = 0;

void setup()
{
    digitalWrite(BUTTON_PIN, LOW);
    pinMode(LED_PIN, OUTPUT);
    pinMode(BUTTON_PIN, INPUT);
    Serial.begin (9600);
}

void loop()
{
    timer.run();
    bool isButtonDown = digitalRead(BUTTON_PIN);
    if (isButtonDown && !wasButtonDown) 
	{
        digitalWrite(LED_PIN, HIGH);
        timer.disable(timer1);
        secCount++;
        Serial.print("+1 second. Total: ");
        Serial.println(secCount);
        timer1 = timer.setInterval(1000, repeatMe);
	}

    wasButtonDown = isButtonDown;
    if (secCount < 1) 
	{
		digitalWrite(LED_PIN, LOW);
    }
    delay(10);
}
	
	
	
void repeatMe() {
    if (secCount > 0) {
      Serial.print("Uptime (s): ");
      Serial.println(secCount);
      secCount--;
    }
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arlover пишет:

Нажимаем кнопку - светодиод горит одну секунду. 
Нажимаем два - две секунды и тд. .... Методом конечных автоматов не смог сделать

"и т.д." предполагает потенциальную бесконечность. Как Вы собирались впихивать её в конечный автомат?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Не понятно в каком конечном автомате Вы запутались. Но автомат с лямда-функцией выглядит так

/**/
typedef void (*pDo)();//тип данных функция void func(void)
typedef byte state_t;// тип данных состояние
state_t state;// переменая состояние
const state_t sOFF = 0; // состояние выключено
const state_t sON = 1; // состояние включено
unsigned long past;// время последнего переключения автомата
pDo run = [] {};// исполнительная функция автомата
void set(state_t s) {
  state = s;
  past = millis();
  switch (s) {
    case sOFF :
      run = [] {};
      break;
    case sON :
      run = [] {};
      break;
  }
}
//---------------------------------------
void setup() {
  set(sOFF);
}

void loop() {
  run();
}

И да Вы так и не сказали что Вы хотите от старожилов форума.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:

автомат с лямда-функцией

Ну, слава Богу! Теперь всё в порядке, а то я уж переживать начал, что не то что-то с задачей :)

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Всё не решаюсь спросить: лямда-функция - это какая-то обязанность, возложенная на бурлаков? Типа там "тянуть лямду" или типа того. Или это новая прогрессивная технология, от которой даже Илон Маск очешуеет?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sadman41 пишет:
Всё не решаюсь спросить: лямда-функция - это какая-то обязанность, возложенная на бурлаков?
Скорее всего вы банально не понимаете что такое лямда функция и главное зачем она.  Вот если убрать лямду, то текст станет сложнее. Вот это лямда и убирает

/**/
typedef byte state_t;// тип данных состояние
state_t state;// переменая состояние
const state_t sOFF = 0; // состояние выключено
const state_t sON = 1; // состояние включено
unsigned long past;// время последнего переключения автомата
void set(state_t s) {
  state = s;
  past = millis();
  switch (s) {
    case sOFF :
      break;
    case sON :
      break;
  }
}
//---------------------------------------
void setup() {
  set(sOFF);
}

void loop() {
  switch (state) {
    case sOFF :

      break;
    case sON :

      break;
  }
}

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Так, чисто поржать. Можно использовать такой вариант

void loop(void) {
// ***************Стробирование
 if (Sekundy >0) {
 if ((millis()-lastMillis)>= 1000) { //стробируем раз в секунду
    lastMillis=millis();
    Sekundy--;
}
  }
  if(Button()) Sekundy++;
  if (Sekundy>0) 
{
   Led=1;
) else Led=0;
}

Тут есть нюанс - кнопка должна срабатывать на отпускании :(

arlover
Offline
Зарегистрирован: 16.03.2019

Задание звучит так: 

Автомат управления освещением по кнопке. Количество нажатий кнопки должно соответствовать времени свечения светодиода.

Пробовал так:

 

void loop()
{
    //timer.run();
    bool isButtonDown = digitalRead(BUTTON_PIN);
    if (isButtonDown && !wasButtonDown) {
	if (ledState == STATE_SHINE)
        {
            ledState = STATE_BLINK;
            Serial.print("State 1. Led turned on for 1 sec\n");
            timer.disable(timer3);
            timer1 = timer.setTimeout(1000, Led_OFF);
            digitalWrite(LED_PIN, HIGH);
        }
        else if (ledState == STATE_BLINK)
        { 
            Serial.print("State 2. Led turned on for 2 sec\n");
            timer.disable(timer1);
            timer2 = timer.setTimeout(2000, Led_OFF);
            digitalWrite(LED_PIN, HIGH);
            ledState = STATE_FADE;
        }
        else if (ledState == STATE_FADE)
        { 
            Serial.print("State 3. Led turned on for 3 sec\n");
            timer.disable(timer2);
            timer2 = timer.setTimeout(3000, Led_OFF);
            digitalWrite(LED_PIN, HIGH);
            ledState = 3;
        }
		delay(10);
    }
}

void Led_OFF()
{
  Serial.print("Led off\n");
  ledState = STATE_SHINE;
  digitalWrite(LED_PIN, LOW);
}

Делал так еще, но преподаватель нажал раз 10 и забраковал, за эти 10 нажатий switch уже успел несколько раз прогнаться по кругу и естественно что десять ожидаемых секунд не прогорело :) Поэтому решил попробовать без автоматов, а потом и вовсе отчаялся. Несколько вопросов знатокам:
1. Сколько лучше заложить возможных значений в switch.

2. Светодиод догорает свои 9 секунд, ему остается секунда и нажимаем еще раз на кнопку, тогда он будет гореть 10(переход в следующий case). Будет ли это считаться как неверно выполненное задание? Потому что по-моему это слишком проблематично считать количество секунд с запуска кнопки, навязывать тонну if'ov и тд. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

На лекции надо было ходить

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

arlover, вот зачем вам код с форума. Если я выложу свое решение 1- скорее всего не поймете всего механизма 2- преподователь поймет что а) код не ваш б) вы ничего не понимаете в коде в) бездельник и лентяй  3- зачем так "палится".
ПС: Состояний надо всего два. А вот при фронте нажатия удлинять время задержки отключения на 1 секунду. И все

arlover
Offline
Зарегистрирован: 16.03.2019

Спасибо за подсказку :)
А по коду, если вы выложите свой код:

а) я разберусь в сложных механизмах

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

 

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

arlover пишет:

...если вы выложите свой код:

а) я разберусь в сложных механизмах

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

с) не исключен шанс, что просто свихнетёсь или узнаете от qwone многое из теорий и практик альтернативных развитий Вселенной.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

arlover пишет:

Спасибо за подсказку :)
А по коду, если вы выложите свой код:

а) я разберусь в сложных механизмах

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

Начните с простого, обработка нажатия и отпускания кнопки

arlover
Offline
Зарегистрирован: 16.03.2019

ua6em пишет:

arlover пишет:

Спасибо за подсказку :)
А по коду, если вы выложите свой код:

а) я разберусь в сложных механизмах

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

Начните с простого, обработка нажатия и отпускания кнопки

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

arlover пишет:

а) я разберусь в сложных механизмах

Хрен там. Разбираться в кодах квона у тебя - двоечника ещё разбиралка не выросла. Не такие разобраться не могут.

mykaida пишет:

Так, чисто поржать. Можно использовать такой вариант

А лямбды где? Низачёт!

qwone пишет:
вы банально не понимаете что такое лямда функция и главное зачем она.

Когда-то давно, когда ты только начинал сериал "классы по квону", человка четыре-пять (разных!!!) пытались тебе объяснить, что ты "банально не понимаешь что такое классы и для чего они". Помнишь?

Объяснять тебе что ты где-то что-то прочитал про лямбды, но при этом "банально не понимаешь что такое лямбды и для чего они" уже никто не пытается, все на классах затрахались :))))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

arlover пишет:
б) посмотрю, как опытные люди мыслят и одну и ту же задачу решают своим профессионализмом с минимальным количеством кода
Очередная ошибка - минимальное количество кода это скорее говнокод или курьез. Вы же не одеваетесь с минимальным количеством одежды и обуви - куртка штаны и туфли, а рубашка, майка, трусы, носки нафиг. Или не проверяете талант портного по миниму одетой одежды на нем. Увидели на портном шары или передник - это плохой портной у него много лишней одежды. Вот так и с программами и программистом - в коде не обязателен минимализм.

/**/
const byte btnPin = 2;// кнопка
const byte ledPin = 13;// ветодиод
//-----автомат-------------------------------------------
typedef void (*pDo)();//тип данных функция void func(void)
typedef byte state_t;// тип данных состояние
state_t state;// переменая состояние
const state_t sOFF = 0; // состояние выключено
const state_t sON = 1; // состояние включено
unsigned long past;// время последнего переключения автомата
unsigned long time;// время выключния автомата
const unsigned long time1s = 1000; //константа 1 секунда
pDo run = [] {};// исполнительная функция автомата
void set(state_t s) {
  state = s;
  past = millis();
  switch (s) {
    case sOFF :
      digitalWrite(ledPin, LOW);
      run = [] {};
      break;
    case sON :
      digitalWrite(ledPin, HIGH);
      run = [] {
        if (millis() - past >= time)set(sOFF);
      };
      break;
  }
}
void up() {
  if (state == sOFF )set(sON);
  else time += time1s;
}
//--------кнопка-----------------------------------
bool btn;
unsigned long btnPast;
//---------------------------------------
void setup() {
  pinMode (ledPin, OUTPUT);
  set(sOFF);
  pinMode (btnPin, INPUT_PULLUP);
  btn = false;
  btnPast = millis();
}
//-----------------------------------------
void loop() {
  run();
  if (millis() - btnPast >= 100) {
    switch (btn) {
      case false:
        if (!digitalRead(btnPin)) {
          btnPast = millis();
          btn = true;
          up();
        }
        break;
      case true:
        if (digitalRead(btnPin)) {
          btnPast = millis();
          btn = false;
        }
        break;
    }
  }
}

ПС: не загружал и не проверял

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ворота пишет:
Когда-то давно, когда ты только начинал сериал "классы по квону", человка четыре-пять (разных!!!) пытались тебе объяснить, что ты "банально не понимаешь что такое классы и для чего они". Помнишь?
Классы это прежде всего это инструмент для программирования. А дуть мне в уши что"топор это не иструмент для рубки дров, и приличные люди только им пробивают  доспехи противника" не надо.Если вас коробит такое использование классов, то я вам не лекарь.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ворота пишет:

А лямбды где? Низачёт!

Извините, дядечка, но не дорос я еще до лямбды. Мы как-нибудь и без этой лямбды-шмабды...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ворота пишет:

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

я и написал в надежде, что ТС выделит обработку кнопки в отдельную функцию, для начала

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:
Если вас коробит такое использование классов, то я вам не лекарь.
А я как-то и не обращался к тебе за лечением.

А коробит меня не использование классов (которые ты от пространств имён не отличаешь), а твои высокомерные, менторские предъявы людям, типа

qwone пишет:
Скорее всего вы банально не понимаете что такое лямда функция и главное зачем она.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

 Вы же не одеваетесь с минимальным количеством одежды и обуви -

))) улыбнул, напомнил анекдот..".что простыл то?... та легко одетым вышел на балкон...???...в одном ..."

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ворота пишет:
Не наезжай на людей (особенно по тем вопросам, в которых сам ни ухом, ни рылом) и будет тебе много счастья.
А что делать что люди считают их "даром богов" и не используют там где надо, особенно в утилитарных вещах. Мол боги обидятся и пошлют несчаться на вашу голову. Я к счастью не так "регилиозен". 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:
А что делать что люди считают их "даром богов" и не используют там где надо
Так я же и говорю. Тебе ведь никто не предъявляет, что ты используешь их там, где не надо. Дед с Евгением подшучивают чуток, но ничего не предъявляют. Ну, и ты людям не предъявляй. И будем жить дружно и мирно.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ворота пишет:
Так я же и говорю. Тебе ведь никто не предъявляет, что ты используешь их там, где не надо. Дед с Евгением подшучивают чуток, но ничего не предъявляют. Ну, и ты людям не предъявляй. И будем жить дружно и мирно.
Вот вам я и не предьявляю, а Вы все время лезете как тараканы. Если Вы под другими аккаундами на форум заходите, так сообщите ,что это Вы и я эту тему покину.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:
Вот вам я и не предьявляю.

Судя по строчной букве - "вам" это множественное число. Тогда поясни, кто Сэдмену предъявлял? Не ты? Твой экаунт взломали?

В общем прекращай наезжать на людей и свысока рассказывать чего они не понимают. И тебя тоже не будут трогать. Ибо сказано: "всяком взъ@@нувшему, да отъ@@нётся, ибо нех".

Ты ещё глюк в своём классе не исправил, а туда же.

arlover
Offline
Зарегистрирован: 16.03.2019

qwone пишет:

arlover пишет:
б) посмотрю, как опытные люди мыслят и одну и ту же задачу решают своим профессионализмом с минимальным количеством кода
Очередная ошибка - минимальное количество кода это скорее говнокод или курьез. Вы же не одеваетесь с минимальным количеством одежды и обуви - куртка штаны и туфли, а рубашка, майка, трусы, носки нафиг. Или не проверяете талант портного по миниму одетой одежды на нем. Увидели на портном шары или передник - это плохой портной у него много лишней одежды. Вот так и с программами и программистом - в коде не обязателен минимализм.

/**/
const byte btnPin = 2;// кнопка
const byte ledPin = 13;// ветодиод
//-----автомат-------------------------------------------
typedef void (*pDo)();//тип данных функция void func(void)
typedef byte state_t;// тип данных состояние
state_t state;// переменая состояние
const state_t sOFF = 0; // состояние выключено
const state_t sON = 1; // состояние включено
unsigned long past;// время последнего переключения автомата
unsigned long time;// время выключния автомата
const unsigned long time1s = 1000; //константа 1 секунда
pDo run = [] {};// исполнительная функция автомата
void set(state_t s) {
  state = s;
  past = millis();
  switch (s) {
    case sOFF :
      digitalWrite(ledPin, LOW);
      run = [] {};
      break;
    case sON :
      digitalWrite(ledPin, HIGH);
      run = [] {
        if (millis() - past >= time)set(sOFF);
      };
      break;
  }
}
void up() {
  if (state == sOFF )set(sON);
  else time += time1s;
}
//--------кнопка-----------------------------------
bool btn;
unsigned long btnPast;
//---------------------------------------
void setup() {
  pinMode (ledPin, OUTPUT);
  set(sOFF);
  pinMode (btnPin, INPUT_PULLUP);
  btn = false;
  btnPast = millis();
}
//-----------------------------------------
void loop() {
  run();
  if (millis() - btnPast >= 100) {
    switch (btn) {
      case false:
        if (!digitalRead(btnPin)) {
          btnPast = millis();
          btn = true;
          up();
        }
        break;
      case true:
        if (digitalRead(btnPin)) {
          btnPast = millis();
          btn = false;
        }
        break;
    }
  }
}

ПС: не загружал и не проверял

 

Не работает, после первого case срабатывает сразу же второй

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

switch (btn) {
	case false:
		......
		break;
	case true:
		break;
		......
}

Вы чего-то покурили?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Вы чего-то покурили?

А я давно заметил, что квон злоупотребляет. Классы скурил, миллис, прогмем еле отбили, так он на case отыгрался.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

да, Пух, мне б такую забористую травку... 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
const byte btnPin = 2;// кнопка
const byte ledPin = 13;// ветодиод
//-----автомат-------------------------------------------
typedef void (*pDo)();//тип данных функция void func(void)
typedef byte state_t;// тип данных состояние
state_t state;// переменая состояние
const state_t sOFF = 0; // состояние выключено
const state_t sON = 1; // состояние включено
unsigned long past;// время последнего переключения автомата
unsigned long time;// время выключния автомата
const unsigned long time1s = 1000; //константа 1 секунда
pDo run = [] {};// исполнительная функция автомата
void set(state_t s) {
  state = s;
  past = millis();
  switch (s) {
    case sOFF :
      digitalWrite(ledPin, LOW);
      Serial.print("time:");
      Serial.print(time);
      Serial.println(" OFF");
      run = [] {};
      break;
    case sON :
      digitalWrite(ledPin, HIGH);
      Serial.println("ON");
      time = time1s;//<---скорее всего профтыкал эту строку
      run = [] {
        if (millis() - past >= time)set(sOFF);
      };
      break;
  }
}
void up() {
  if (state == sOFF )set(sON);
  else time += time1s;
}
//--------кнопка-----------------------------------
bool btn;
unsigned long btnPast;
//---------------------------------------
void setup() {
  Serial.begin(9600);
  pinMode (ledPin, OUTPUT);
  set(sOFF);
  pinMode (btnPin, INPUT_PULLUP);
  btn = false;
  btnPast = millis();
}
//-----------------------------------------
void loop() {
  run();
  if (millis() - btnPast >= 100) {
    switch (btn) {
      case false:
        if (!digitalRead(btnPin)) {
          btnPast = millis();
          btn = true;
          up();
          Serial.println("Tuck");
        }
        break;
      case true:
        if (digitalRead(btnPin)) {
          btnPast = millis();
          btn = false;
        }
        break;
    }
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone, не привыкайте к этой гадости.

arlover
Offline
Зарегистрирован: 16.03.2019

qwone пишет:

/**/
const byte btnPin = 2;// кнопка
const byte ledPin = 13;// ветодиод
//-----автомат-------------------------------------------
typedef void (*pDo)();//тип данных функция void func(void)
typedef byte state_t;// тип данных состояние
state_t state;// переменая состояние
const state_t sOFF = 0; // состояние выключено
const state_t sON = 1; // состояние включено
unsigned long past;// время последнего переключения автомата
unsigned long time;// время выключния автомата
const unsigned long time1s = 1000; //константа 1 секунда
pDo run = [] {};// исполнительная функция автомата
void set(state_t s) {
  state = s;
  past = millis();
  switch (s) {
    case sOFF :
      digitalWrite(ledPin, LOW);
      Serial.print("time:");
      Serial.print(time);
      Serial.println(" OFF");
      run = [] {};
      break;
    case sON :
      digitalWrite(ledPin, HIGH);
      Serial.println("ON");
      time = time1s;//<---скорее всего профтыкал эту строку
      run = [] {
        if (millis() - past >= time)set(sOFF);
      };
      break;
  }
}
void up() {
  if (state == sOFF )set(sON);
  else time += time1s;
}
//--------кнопка-----------------------------------
bool btn;
unsigned long btnPast;
//---------------------------------------
void setup() {
  Serial.begin(9600);
  pinMode (ledPin, OUTPUT);
  set(sOFF);
  pinMode (btnPin, INPUT_PULLUP);
  btn = false;
  btnPast = millis();
}
//-----------------------------------------
void loop() {
  run();
  if (millis() - btnPast >= 100) {
    switch (btn) {
      case false:
        if (!digitalRead(btnPin)) {
          btnPast = millis();
          btn = true;
          up();
          Serial.println("Tuck");
        }
        break;
      case true:
        if (digitalRead(btnPin)) {
          btnPast = millis();
          btn = false;
        }
        break;
    }
  }
}

 

 

Вот .это работает, спасибо!
Буду разбираться

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

arlover пишет:

qwone пишет:

/**/
const byte btnPin = 2;// кнопка
const byte ledPin = 13;// ветодиод
//-----автомат-------------------------------------------
typedef void (*pDo)();//тип данных функция void func(void)
typedef byte state_t;// тип данных состояние
state_t state;// переменая состояние
const state_t sOFF = 0; // состояние выключено
const state_t sON = 1; // состояние включено
unsigned long past;// время последнего переключения автомата
unsigned long time;// время выключния автомата
const unsigned long time1s = 1000; //константа 1 секунда
pDo run = [] {};// исполнительная функция автомата
void set(state_t s) {
  state = s;
  past = millis();
  switch (s) {
    case sOFF :
      digitalWrite(ledPin, LOW);
      Serial.print("time:");
      Serial.print(time);
      Serial.println(" OFF");
      run = [] {};
      break;
    case sON :
      digitalWrite(ledPin, HIGH);
      Serial.println("ON");
      time = time1s;//<---скорее всего профтыкал эту строку
      run = [] {
        if (millis() - past >= time)set(sOFF);
      };
      break;
  }
}
void up() {
  if (state == sOFF )set(sON);
  else time += time1s;
}
//--------кнопка-----------------------------------
bool btn;
unsigned long btnPast;
//---------------------------------------
void setup() {
  Serial.begin(9600);
  pinMode (ledPin, OUTPUT);
  set(sOFF);
  pinMode (btnPin, INPUT_PULLUP);
  btn = false;
  btnPast = millis();
}
//-----------------------------------------
void loop() {
  run();
  if (millis() - btnPast >= 100) {
    switch (btn) {
      case false:
        if (!digitalRead(btnPin)) {
          btnPast = millis();
          btn = true;
          up();
          Serial.println("Tuck");
        }
        break;
      case true:
        if (digitalRead(btnPin)) {
          btnPast = millis();
          btn = false;
        }
        break;
    }
  }
}

 

 

Вот .это работает, спасибо!
Буду разбираться

 

Круто, несколько раз пытался с налёта понять, как это работает, увы... )))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, вот, написали готовый код двоешнику. Помгли парню так и остаться без мозгов. Взрослые люди, мля!

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Что не понятно? Как образован обработчик кнопки или автомат на лямде. Или о ужас вы спрашиваете о switch- е?

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

arlover
Offline
Зарегистрирован: 16.03.2019

Ворота пишет:

Ну, вот, написали готовый код двоешнику. Помгли парню так и остаться без мозгов. Взрослые люди, мля!

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

 

Вы слишком токсичны, не понимаю откуда столько негатива

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

Что не понятно? Как образован обработчик кнопки или автомат на лямде. Или о ужас вы спрашиваете о switch- е?

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

я к свитч конструкциям еще даже не подступался...
Вы же видите, мои наброски не сложнее блинка )))

arlover
Offline
Зарегистрирован: 16.03.2019

Ворота пишет:

И это вроде как форум по ардуино, раздел "вопросы по программированию", а не обсуждение жизни и обсуждение других форумчан.

Если нет желания помогать - можете пойти в другой раздел и писать чушь там.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ворота пишет:

Ну, вот, написали готовый код двоешнику. Помгли парню так и остаться без мозгов. Взрослые люди, мля!

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

А я ему сходу задачку, подсчитать объём бочки уложенной на бок через 1 миллиметр наполнения, как думаете - одолеет )))

arlover
Offline
Зарегистрирован: 16.03.2019

Все владеют идеальными знаниями, но примеров вашего идеального кода я не нашел. По делу помог только qwone

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Топ-менеджерам задачи про бочки не задают. Это только обслуживающий персонал должен доказывать, что "достоин" МРОТ*1.5.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:

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

Да думаю. Легион ленивых безмозглых задниц состоит из отдельных одиночных экземпляров. И одному такоу экземпляру ты сегодня помог сдать на шару. А "одной больше - одной меньше" - ну, давай всем дегенератам сразу дипломы выдавать, чего время-то терять на форумные тёрки!

В общем, моё пожелание остаётся в силе.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sadman41, вот и пришли к выводу. Не сможет ТС найти место среди обслуживающего персонала, то придется идти в топ-менеджеры. А всякие оценки в универе или даже дипломы не гарантируют рабочего места. И да уровень кода "допускаемого выдавать новичкам" ну очень низок что бы даже работать программистом. Так что притензии Ворота ничем не обоснованы в реалиях современной жизни.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

arlover пишет:
не понимаю откуда столько негатива

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

arlover пишет:
И это вроде как форум по ардуино, раздел "вопросы по программированию"

Совершенно верно! А богадельня для дегенератов, неспособных освоить учебную программу!

arlover пишет:
можете пойти в другой раздел и писать чушь там.

Мальчик, ты это прекращай, а то я тебе объясню куда тебе пойти.

arlover
Offline
Зарегистрирован: 16.03.2019

Ворота пишет:

arlover пишет:
не понимаю откуда столько негатива

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

arlover пишет:
И это вроде как форум по ардуино, раздел "вопросы по программированию"

Совершенно верно! А богадельня для дегенератов, неспособных освоить учебную программу!

arlover пишет:
можете пойти в другой раздел и писать чушь там.

Мальчик, ты это прекращай, а то я тебе объясню куда тебе пойти.

 

Объясни куда пойти. Мальчик - тут только ты, судя по поведению.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А меня интересует только один вопрос, сумеет ли ТС рассказать по коду, что, как и зачем )))

Может ПУХ спецом, чтобы ТС завалился на сдаче

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:
притензии Ворота ничем не обоснованы в реалиях современной жизни.
Немного ж ты видел реалий-то!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, Володя. Вот прямо сейчас прекратил. Поздно пить Боржом. Да и один хрен он не сдаст, квоновский код сдать невозможно, разве что преподаватель совсем на всё забьёт.

arlover, тоже самое - немедленно прекратите.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Прекратил.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arlover, я просил вас обоих прекратить. У одного хватило ума, у другого - нет. Ваш пост удаляю.