Внутри case, OLED тормозит millis.

Igoreck
Offline
Зарегистрирован: 01.03.2017

Внутри case, OLED тормозит millis!

Как побороть?

Без вывода на дисплей работает все четко, а с выводом тормозит раз в 5 наверное.

Как правильно оформить логику или сам код?

#include <OLED_I2C.h>
OLED  myOLED(SDA, SCL, 1);
extern uint8_t SmallFont[];
const int endSwitch_a = 10;
const int endSwitch_b = 11;
const byte butnPin = 2;
bool butn;
const byte ledPin = 13;
bool Led;
unsigned long past;
const unsigned long time2sec = 2000;
unsigned long mill;
int endSwitch_a_State = 0 ;

enum {READY_ERROR, CARRENT_SENSOR} Mode;

void setup() {
  if (!myOLED.begin(SSD1306_128X64))
    while (1);
  myOLED.setFont(SmallFont);
  pinMode(2, 0x2);
  pinMode(butnPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, Led = 0);
  pinMode(endSwitch_a, INPUT_PULLUP);
}
void loop() {
  switchEnd();
  stateManager();
}
void switchEnd() {
  endSwitch_a_State = !digitalRead(endSwitch_a);
  if (endSwitch_a_State == 0) {
    Mode = READY_ERROR;
  }
  else Mode = CARRENT_SENSOR;
}
void stateManager() {
  switch  (Mode) {
    case READY_ERROR:
      mill = millis();
      butn = digitalRead(butnPin);
      if ((!butn) && (past == 0)) { /* если кнопка нажата*/
        digitalWrite(ledPin, Led = 1); /*то вкл светодиод*/
        past = mill;
      }
      if (Led & mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
        digitalWrite(ledPin, Led = 0);/*то выкл*/
      }
      //============ вывожу на дисплей и время замедляется ============
      myOLED.clrScr();
      myOLED.print("READY_ERROR", CENTER, 0 );
      myOLED.update();
      //===============================================================
      break;
    case CARRENT_SENSOR:
      myOLED.clrScr();
      myOLED.print("CARRENT_SENSOR", CENTER, 0 );
      myOLED.update();    
      break;
  }
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Чо, вместо 2 секунд диод горит 10? Или как определил то?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Строка 47 вообще как работает ?
Может все же не '&' а "&&" там должно быть ?

Иначе выражение Led&mill будет равно либо 0 (если mill имеет четное значение) либо 1 (если нечётное), ну и вычитать из него что то , такое себе занятие ...

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

У Вас не миллис тормозит. Вы сами тормозите не по детски.

Что за бред написан в строках №№ 47-49? Вы при КАЖДОМ проходе loop выполняете clrScr и update. Чего б ему не тормозить?

А миллис Вы вообще используете только один раз. После первого исполнения строки №45, миллис больше вообще не используется.

Igoreck
Offline
Зарегистрирован: 01.03.2017

Kakmyc пишет:
Строка 47 вообще как работает ? Может все же не '&' а "&&" там должно быть ? Иначе выражение Led&mill будет равно либо 0 (если mill имеет четное значение) либо 1 (если нечётное), ну и вычитать из него что то , такое себе занятие ...

Возможно. Я у "квона" позаимствовал.

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

Какая разница, у кого Вы позаимствовали?

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

Igoreck
Offline
Зарегистрирован: 01.03.2017

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

У Вас не миллис тормозит. Вы сами тормозите не по детски.

Что за бред написан в строках №№ 47-49? Вы при КАЖДОМ проходе loop выполняете clrScr и update. Чего б ему не тормозить?

А миллис Вы вообще используете только один раз. После первого исполнения строки №45, миллис больше вообще не используется.

Дык а как мне выводить, и при этом выполнять процедуру кейса.

Igoreck
Offline
Зарегистрирован: 01.03.2017

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

Какая разница, у кого Вы позаимствовали?

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

Подскажите как правильно! Это же форум? Или здесь умеют обзывать тормозами!

sadman41
Offline
Зарегистрирован: 19.10.2016

Здесь всё умеют.

http://arduino.ru/tutorials/BlinkWithoutDelay - вместо светодиода следует дёргать экран.

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

Kakmyc пишет:
Строка 47 вообще как работает ? Может все же не '&' а "&&" там должно быть ? Иначе выражение Led&mill будет равно либо 0 (если mill имеет четное значение) либо 1 (если нечётное), ну и вычитать из него что то , такое себе занятие ...

Да, нет, см. приоритет операций.

Другое дело, что я уже задолбался писать ТС в каждой теме

Igoreck СТАВЬТЕ СКОБКИ !!!

Но он же, сцуко, умнее всех и плевать ему на то, что здесь пишут. Он уже "зделал".

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

Igoreck пишет:

Подскажите как правильно! 

А Вы для начала объясните словами, что написано в строках, которые я упомянул. Глядишь, пока объясняете и поймёте. А нет, так помогу.

"Это же форум? Или "вы умеете только не думая передрать у квона, не понимая ни одной буквы, и требовать, чтобы Вам написали правильно? Вам тут все должны? Или через одного?

Я Вам подсказал в каких именно строках у Вас бред. Так и работайте над этим.

Igoreck
Offline
Зарегистрирован: 01.03.2017

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

Kakmyc пишет:
Строка 47 вообще как работает ? Может все же не '&' а "&&" там должно быть ? Иначе выражение Led&mill будет равно либо 0 (если mill имеет четное значение) либо 1 (если нечётное), ну и вычитать из него что то , такое себе занятие ...

Да, нет, см. приоритет операций.

Другое дело, что я уже задолбался писать ТС в каждой теме

Igoreck СТАВЬТЕ СКОБКИ !!!

Но он же, сцуко, умнее всех и плевать ему на то, что здесь пишут. Он уже "зделал".

Не обобщайте, да и не судите по себе.

Какие скобки и где ставить? 

Igoreck
Offline
Зарегистрирован: 01.03.2017

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

Igoreck пишет:

Подскажите как правильно! 

А Вы для начала объясните словами, что написано в строках, которые я упомянул. Глядишь, пока объясняете и поймёте. А нет, так помогу.

"Это же форум? Или "вы умеете только не думая передрать у квона, не понимая ни одной буквы, и требовать, чтобы Вам написали правильно? Вам тут все должны? Или через одного?

Я Вам подсказал в каких именно строках у Вас бред. Так и работайте над этим.


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

Igoreck пишет:

Какие скобки и где ставить? 

Если после вот этого поста, Вы ещё не поняли, то не ставьте нигде и никакие.

И, да, кстати, правильно ли я Вас понял, что моя просьба "А Вы для начала объясните словами, что написано в строках, которые я упомянул" проигнорирована?

Igoreck
Offline
Зарегистрирован: 01.03.2017

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

Igoreck пишет:

Какие скобки и где ставить? 

Если после вот этого поста, Вы ещё не поняли, то не ставьте нигде и никакие.

У меня там не правильная приоритезация?

[/quote]

И, да, кстати, правильно ли я Вас понял, что моя просьба "А Вы для начала объясните словами, что написано в строках, которые я упомянул" проигнорирована?

[/quote]

Нет не игнорировал, а думаю как объяснить словами.

if (Led && mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
        digitalWrite(ledPin, Led = 0);/*то выкл*/

Думаю что как - то так:

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

 

Igoreck
Offline
Зарегистрирован: 01.03.2017

Мне кто-нибудь поможет?

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

Igoreck пишет:

У меня там не правильная приоритезация?

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

Вот она, сцуко, Ваша "приоритезация" ... ответьте, что у Вас написан вот в этом месте:

 Led && mill - past >= time2sec

Это означает:

Led && (mill - past >= time2sec)

или

(Led && mill - past) >= time2sec

или

Led && (mill - past) >= time2sec

Ну, можете ответить? 
"приоритезация" у него!

Igoreck пишет:

Нет не игнорировал, а думаю как объяснить словами.

if (Led && mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
        digitalWrite(ledPin, Led = 0);/*то выкл*/

Думаю что как - то так:

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

Подумайте ещё и объясните СЛОВАМИ как оно работает. Вы правила форума читали?

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

Вы же не понимаете, что там написано, поэтому что-то подсказывать Вам бесполезно. Ну, попробую, конечно, ... нух, хорошо, Вы выждали интервал, а где "будильник заводится на новый"?

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

Igoreck пишет:

Мне кто-нибудь поможет?

Да, как только начнёте работать сами.

Объясните, что и как у Вас работает и объясните словами. 

Разберитесь в моём вопросе про скобки из предыдущего поста и ответьте на него. Только доказательно ответьте, а не пальцем в небо.

Igoreck
Offline
Зарегистрирован: 01.03.2017

Думаю так будет правильней. Даже скобки поставлю!

if ((mill - past) >= time2sec){

}

Словами это:

Если вычтеное  время старта (past), от времени запуска (mill) больше чем две секунды, то ...

А вообще-то, боюсь далее вести диалог, в виду того как гражданин "ЕвгенийП", очень нервничает.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Чо ему нервничать то? Нервничать ты должен. Если хоть немного уважения к отвечающему на твой вопрос имеется.

b707
Offline
Зарегистрирован: 26.05.2017

Igoreck -языки вам явно не даются.

В прошлый раз я вычитал у вас _з_делал, теперь читаю C_a_rrent

Carrent - это что? Car_rent? - прокат авто?

И Си вы тоже не знаете... не даются вам языки

 

 

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Igoreck пишет:

      if (Led & mill - past >= time2sec) {/*если светодиод горит больше 2 сек*/
        digitalWrite(ledPin, Led = 0);/*то выкл*/
      }

Может это концептуальное программирование? Ну по типу концептуального искусства? А мы просто не догоняем! ;)))) Злые мы стали, и "квартирный вопрос" опять же... эхх...

Igoreck
Offline
Зарегистрирован: 01.03.2017

b707 пишет:

Igoreck -языки вам явно не даются.

В прошлый раз я вычитал у вас _з_делал, теперь читаю C_a_rrent

Carrent - это что? Car_rent? - прокат авто?

И Си вы тоже не знаете... не даются вам языки

 

 

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

«Current» , «сделал» - поспешил и опечатался, с кем не бывает.

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

Вот Вы своим детям тоже так объясняете типа, ты что тупой, не умеешь читать, писать, считать не важно, - это не твоё.

Почему здесь на форуме так относятся к тебе, как к прокаженному.

Я никого не оскорбляю, пытаюсь научится, мне это нравится.  

 

b707
Offline
Зарегистрирован: 26.05.2017

Igoreck пишет:

«Current» , «сделал» - поспешил и опечатался, с кем не бывает.

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

А что до отношения к тебе - надо не только лошить на форуме и вопросы задавать, надо и самому искать ответы в книжках и в сети. А ты все готовенького ждешь. И еще - когда тебя говорят. как правильно - то надо слушать, а не огрызаться.

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Igoreck пишет:

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


Представим: подошел к Вам в парке карапуз лет шести и говорит - дед, как посчитать площадь нашего города?

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

sadman41 пишет:
дед, как посчитать площадь нашего города?

А я ему: "Да лехко. Нужно длину города умножить на ширину города, и сё. Иди, малыш, мерий" 

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

Igoreck пишет:

Думаю так будет правильней. Даже скобки поставлю!

if ((mill - past) >= time2sec){

}

Словами это:

Если вычтеное  время старта (past), от времени запуска (mill) больше чем две секунды, то ...

А вообще-то, боюсь далее вести диалог, в виду того как гражданин "ЕвгенийП", очень нервничает.

В посте #16 в моём вопросе там еще Led был. Ответьте полностью.

Что касается описания словами. Я же Вам дал наводящий вопрос, "как Вы заводите будильник для нового звонка?" Вас это ни на какие мысли не навело? Как он в следующий раз сработает? Если бы Вы попытаись сами объяснить работу (а не скопипастили не понимая), Вы не могли бы не споткнуться об эту ошибку.

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

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

Igoreck
Offline
Зарегистрирован: 01.03.2017

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

Igoreck пишет:

Думаю так будет правильней. Даже скобки поставлю!

if ((mill - past) >= time2sec){

}

Словами это:

Если вычтеное  время старта (past), от времени запуска (mill) больше чем две секунды, то ...

А вообще-то, боюсь далее вести диалог, в виду того как гражданин "ЕвгенийП", очень нервничает.

В посте #16 в моём вопросе там еще Led был. Ответьте полностью.

Что касается описания словами. Я же Вам дал наводящий вопрос, "как Вы заводите будильник для нового звонка?" Вас это ни на какие мысли не навело? Как он в следующий раз сработает? Если бы Вы попытаись сами объяснить работу (а не скопипастили не понимая), Вы не могли бы не споткнуться об эту ошибку.

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

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

Led && mill - past >= time2sec

Led && здесь лишний и не нужен, так как он в этом выражении принимает два значения до нажатия кнопки 0, а после 1.

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

Соответственно:

 

1) Led && (mill - past >= time2sec)

Если вычитаемое время старта (past), от времени запуска (mill) больше или равно чем две секунды, и логическая 1 (Led) которая здесь при запуске принимает истинное значение, то получается, - если истина и истина, значит истина.

 

2)(Led && mill - past) >= time2sec

Здесь по моему мнению логики нет. И конструкция не работает.

Если время старта (past), минус время запуска (mill), то есть от меньшего отнять больше получим ложь, и логическая 1 (Led) истина,  больше или равно чем две секунды, то получается, - если ложь и истина значит ложь.  

 

3)Led && (mill - past) >= time2sec  1

Тут также рабочая конструкция, как и в первом варианте.

Если истина и истина то истина.

 

По поводу будильника. Я прекрасно понимаю, что функция однократного действия.

Но если добавить условие "past = 0;", которое возращает "затвор", то функция многократного действия.

 

mill = millis();
              butn = digitalRead(butnPin);
              if ((!butn)&&(past==0)) { /* если кнопка нажата*/
                digitalWrite(ledPin, Led = 1); /*то вкл светодиод*/
                past = mill;
              }
              if ((mill - past) >= time2sec) {/*если светодиод горит больше 2 сек*/
                digitalWrite(ledPin, Led = 0);/*то выкл*/
                past = 0;
              }  

 

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

Ах да, по поводу нерешенной задачи. Подскажите пожалуйста, а написать, я напишу.

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

wdrakula пишет:

Может это концептуальное программирование? Ну по типу концептуального искусства? А мы просто не догоняем! ;)))) Злые мы стали, и "квартирный вопрос" опять же... эхх...

а я давно говорил, что москвичей испортил квартирный вопрос, вон чел под Архызом сделал шалаш и уже несколько лет ждёт конца света, наслаждаясь свободой )))