Вопрос с опросами пинов или выполнение кода по таймеру millis

Signalsus
Offline
Зарегистрирован: 04.11.2018

Приветствую всех камрады!

вопрос такой, нужно сделать как можно проще выполнение функции по истечении счетчика времени

их может быть много, поэтому делаю такой массив

//===================Структура таймеров для работы===================
struct TimersWork {
           word PERIOD_;       //--------------Время периода срабатывания-----------
           word PERIOD_LAST;   //--------------Последние время измерения------------
           boolean STATE;      //--------------Если сработало-----------------------
                  } type ;

struct TimersWork LDFlash = {1000,0,LOW};

void loop() {
struct TimersWork LEDFlash = TTimerWork(LDFlash);
     if (LDFlash.STATE) {
     LDFlash.PERIOD_LAST = 0;
     Serial.println("OK=");//+boolean(LDFlash.STATE)
     } else {
     Serial.println("NO=");//+boolean(LDFlash.STATE)
     }

}


struct TimersWork TTimerWork(struct TimersWork DDTimer) {
  unsigned long currentMillis = millis(); // таймер на millis()
  
  if (currentMillis - DDTimer.PERIOD_LAST >= DDTimer.PERIOD_) { 
    DDTimer.PERIOD_LAST = currentMillis; 
    Serial.println(DDTimer.PERIOD_LAST);

    
if (DDTimer.STATE != LOW) {
  DDTimer.STATE = LOW;
} else {
  DDTimer.STATE = HIGH;
  DDTimer.PERIOD_LAST = 0;
  //tone(pinBuzzer, 2800, 500);
}  
}
return DDTimer;
}

вообщем вопрос, я не силен в ардуине и тем более в Си, вопрос такой как сделать, так, чтоб при истечении времени, скажем 1000 мсек, возвращала true и обнуляла счетчик?

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

Signalsus пишет:

вообщем вопрос, я не силен в ардуине и тем более в Си

тогда спросите там, где вы это все списали...

Signalsus
Offline
Зарегистрирован: 04.11.2018

b707 пишет:

Signalsus пишет:

вообщем вопрос, я не силен в ардуине и тем более в Си

тогда спросите там, где вы это все списали...

кто списал? я мучаюсь с разной таймерной штукой и не у кого не списывал,

а с чего ты решил, что я списал?

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

Посмотри как здесь сделано. 

https://github.com/DetSimen/Arduino_TimerList

Signalsus
Offline
Зарегистрирован: 04.11.2018

DetSimen пишет:

Посмотри как здесь сделано. 

https://github.com/DetSimen/Arduino_TimerList

 

не, это не то, похоже но не то

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

тогда отвецтвуй, что у тебя в строке 25 происходит, и что будет, когда выполнится 34 строка. Ну и до кучи, в структуре замени поля word на uint32_t

Signalsus
Offline
Зарегистрирован: 04.11.2018

вопрос в том, что я не силен в Си, но силен в ассемблере, делфи*(pascal, php, js, perl), а вот с в Си нет такой глубости познаний, конечно, через пару часов я разберусь, вопрос тут в реализации

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

Signalsus пишет:

как сделать, так, чтоб при истечении времени, скажем 1000 мсек, возвращала true и обнуляла счетчик?

Хто?

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

Signalsus пишет:

вопрос в том, что я не силен в Си, но силен в ассемблере, делфи*(pascal, php, js, perl)

Нет. В этом ты тоже не силён. 

Signalsus
Offline
Зарегистрирован: 04.11.2018

DetSimen пишет:

Signalsus пишет:

вопрос в том, что я не силен в Си, но силен в ассемблере, делфи*(pascal, php, js, perl)

Нет. В этом ты тоже не силён. 

 

согласен, но ты видел первые мои посты? напиши на коленки функцию по первому моему посту

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Signalsus пишет:

 

согласен, но ты видел первые мои посты? напиши на коленки функцию по первому моему посту

Так по первому посту нифига не понятно, что именно тебе надо-то

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

Signalsus пишет:

 напиши на коленки функцию по первому моему посту

Написал. Выложил на git, ссылку тебе дал. Там именно массив таймеров, по истечению интервала, вызывается переданная функция. Как можно проще. 

Signalsus
Offline
Зарегистрирован: 04.11.2018

благодарю, я видел, но это не совсем то, что нужно

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

тогда я напомню название твоей темы

Вопрос с опросами пинов или выполнение кода по таймеру millis

чем моё решение сюда не вписывается?  По сработавшему таймеру я могу опрашивать пины или выполнять любую другую функцию, например, гасить подсветку LCD через 5 сек после последнего нажатия кнопки. 

 

Signalsus
Offline
Зарегистрирован: 04.11.2018

DetSimen пишет:

Signalsus пишет:

 напиши на коленки функцию по первому моему посту

Написал. Выложил на git, ссылку тебе дал. Там именно массив таймеров, по истечению интервала, вызывается переданная функция. Как можно проще. 

сорри, все прочитал, вроде как нужно мне)))

Signalsus
Offline
Зарегистрирован: 04.11.2018

Signalsus пишет:

DetSimen пишет:

Signalsus пишет:

 напиши на коленки функцию по первому моему посту

Написал. Выложил на git, ссылку тебе дал. Там именно массив таймеров, по истечению интервала, вызывается переданная функция. Как можно проще. 

сорри, все прочитал, вроде как нужно мне)))

 

не то

nik182
Онлайн
Зарегистрирован: 04.05.2015

А что то? Твоя программа не компилируется. Loop строчит как пулемёт в сериал. Пины не опрашиваются. Millis вызываетя криво в инициализации переменной. Типы перемешаны. Setup отсутвует.
Попробуй нарисовать алгоритм блоксхему чего ты хочешь. Может самому станет понятно что делать. Не то про дедовы таймеры это показатель. Они полностью отвечают поставленной задаче.

Signalsus
Offline
Зарегистрирован: 04.11.2018

ну там все присутсвует

#include "pitches.h";
#include "U8glib.h";
//=================НАСТРОЙКИ DISPLAY SIEMENS A52=========
#define pinCLK 12
#define pinMOSI 11
#define pinCS 9
#define pinDC 10
#define pinRES 8
//-----Инициализация дисплея
U8GLIB_PCF8812 u8g(pinCLK, pinMOSI, pinCS, pinDC, pinRES);


//============================
//===============

//=================ЦИФРОВЫЕ ПИНЫ======================
#define ledPin 13              //---просто индиктор работы
#define pinON_Temperature 7    //---Включить нагрев экструдера
#define pinON_Motor 6          //---Pin включения мотора намотки
#define pinBuzzer 5            //---Проигрывание мелодий и сигналов
//#define pinHolData 2           //---датчик хола
//====================================================

//===============АНАЛОГОВЫЕ ПИНЫ=======================
#define pinTEMP_Read A7        //---Температура термопары
#define pinREAD_SPEED_motor A4 //---pin резистора установки оборотов двигателя
#define pinBUTTONS A5          //---кнопки 1-3
//====================================================

//==============ПЕРЕМЕННЫЕ ==============
uint16_t TEMP_REAL = 999;

//=================НАСТРОЙКИ МУЗЫКИ===================
int melody[] = {
  NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
  4, 8, 8, 4, 4, 4, 4, 4
};

//===================Структура таймеров для работы===================
struct TimersWork {
           word PERIOD_;       //--------------Время периода срабатывания-----------
           word PERIOD_LAST;   //--------------Последние время измерения------------
           boolean STATE;      //--------------Если сработало-----------------------
                  } type ;
//==================================================================
struct TimersWork LDFlash = {1000,0,LOW};

  //================НАСТРОЙКИ ТАЙМЕРОВ ОБРАБОТОК===========================
#define T_PERIOD_led_flash 1000  // период переключения светодиода мсек
word T_PERIOD_led_flash_last = 0;
boolean isState = LOW;
//=======================================================================


void setup() {
Serial.begin(9600);  
//===============УСТАНОВКИ ЦИФРОВЫХ ПИНОВ===========
pinMode(ledPin, OUTPUT);
pinMode(pinON_Temperature, OUTPUT);
pinMode(pinON_Motor, OUTPUT);
pinMode(pinREAD_SPEED_motor, INPUT);
pinMode(pinBuzzer, OUTPUT);
//=======================================
  
PlaySoundINIT();

u8g.setColorIndex(1);// чб дисплей 1-включить цвет, 0 - выключить
u8g.setContrast(120);// контрастность
//u8g.setRot90();
u8g.setRot180();


}

void loop() {
     //LedFlash();
     struct TimersWork LDFlash = TTimerWork(LDFlash);
     if (LDFlash.STATE) {
     LDFlash.PERIOD_LAST = 0;
     Serial.println("OK=");//+boolean(LDFlash.STATE)
     } else {
     Serial.println("NO=");//+boolean(LDFlash.STATE)
     }
     DarwDisplay();
     delay(5000);
}

void DarwDisplay(void) {
 
 u8g.firstPage();  
  do {
    u8g.setFont(u8g_font_unifontr);
 //u8g.setFont(u8g_font_helvB08); //u8g_font_6x10   
 //u8g.setFont(u8g_font_6x10); //u8g_font_6x10   
    u8g.drawStr(0,14,"TS:");
    u8g.drawStr(22,14,DrawNumber(TEMP_REAL));
    u8g.drawStr(49,14,">C:");
    u8g.drawStr(75,14,DrawNumber(320));
    u8g.drawLine(15, 18, 95, 18); 
    
  } while( u8g.nextPage() );
}


const char *DrawNumber(uint16_t fps) {
  int cntBuf = LenNumSym(fps);
  // 
  static char buf[4];
  strcpy(buf, u8g_u16toa( (uint16_t)(fps), cntBuf));
  return buf;
} 


byte LenNumSym(int IntNum) {
  if (IntNum <=9) {return 1;} 
  else if (IntNum >=10 && IntNum <=99) {return 2;} 
  else if (IntNum >=100 && IntNum <=999) {return 3;} 
  else if (IntNum >=1000 && IntNum <=9999) {return 4;} 
}


struct TimersWork TTimerWork(struct TimersWork DDTimer) {
  unsigned long currentMillis = millis(); // таймер на millis()
  word TimerMils = currentMillis - DDTimer.PERIOD_LAST;
  if (TimerMils >= DDTimer.PERIOD_) { 
    DDTimer.PERIOD_LAST = currentMillis; 
    //Serial.println(DDTimer.PERIOD_LAST);
    Serial.println("TimerMils="+String(TimerMils));
    // если светодиод не горит, то зажигаем, и наоборот
    
if (DDTimer.STATE != LOW) {
  DDTimer.STATE = LOW;
} else {
  DDTimer.STATE = HIGH;
  DDTimer.PERIOD_LAST = 0;
  //tone(pinBuzzer, 2800, 500);
}  
} else {
  Serial.println("ELSE");
}
return DDTimer;
}

void LedFlash(void) {
 // put your main code here, to run repeatedly:
 unsigned long currentMillis = millis();
  if (currentMillis - T_PERIOD_led_flash_last >= T_PERIOD_led_flash) { // таймер на millis()
    T_PERIOD_led_flash_last = currentMillis; 
    // если светодиод не горит, то зажигаем, и наоборот
    
if (isState != LOW) {
  isState = LOW;
  
} else {
  isState = HIGH;
  //tone(pinBuzzer, 2800, 500);
}
digitalWrite(ledPin, isState);
}
}


void PlaySoundINIT(void) {
// iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(pinBuzzer, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.10;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(pinBuzzer);
  }
}

 

Signalsus
Offline
Зарегистрирован: 04.11.2018

тебе это что-то поможет?

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

я тебе последний раз говорю, millis() отдаёт uint32_t, а пихаешь ты его в word PERIOD_LAST;

пи.дец, это клиника

082  LDFlash.PERIOD_LAST = 0;

 

127

  word TimerMils = currentMillis - DDTimer.PERIOD_LAST

128   if (TimerMils >= DDTimer.PERIOD_)

О каком знании ассемблера ты вещаешь?  

 

 

Signalsus
Offline
Зарегистрирован: 04.11.2018

DetSimen пишет:

я тебе последний раз говорю, millis() отдаёт uint32_t, а пихаешь ты его в word PERIOD_LAST

 

епсти, ты прав, благодарствую

 

Signalsus
Offline
Зарегистрирован: 04.11.2018

Signalsus пишет:

DetSimen пишет:

я тебе последний раз говорю, millis() отдаёт uint32_t, а пихаешь ты его в word PERIOD_LAST

 

епсти, ты прав, благодарствую

 

хотя все равно не работает

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

Signalsus пишет:

хотя все равно не работает

Естественно.  Весь код чуть менее чем полностью похож на авно. 

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

DetSimen пишет:

я тебе последний раз говорю, millis() отдаёт uint32_t, а пихаешь ты его в word PERIOD_LAST;

пи.дец, это клиника

082  LDFlash.PERIOD_LAST = 0;

127

  word TimerMils = currentMillis - DDTimer.PERIOD_LAST

128   if (TimerMils >= DDTimer.PERIOD_)

О каком знании ассемблера ты вещаешь?  

то-то и оно, глянул как-то ассемблерную программу для атмеги и, не, не потяну, там даташит читать да читать, регистры строго регламентированы, уж лучше в ардуино IDE потихоньку ковыряться

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

ассемблер + php, js, perl - это расчетверение личности, как минимум. 

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

ассемблер понятие абстрактное, а вот php после С понятен, был у меня кластер на перле, шаг влево, шаг вправо - расстрел на месте, JS даже не пытался, может он такой как и я программист?  )))

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

Опять "20 языков на уровне выше ..., тока вот Си в эти 20 не входит".

Signalsus пишет:

через пару часов я разберусь

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

Signalsus
Offline
Зарегистрирован: 04.11.2018

вообщем, я понял...идете все нахюююй

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

И Вам того же!

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

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

Опять "20 языков на уровне выше ..., тока вот Си в эти 20 не входит".

и как абычно - вранье чистой воды.

Списал где-то код и теперь пытается подогнать под свои хотелки...

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

Может убить тему, чего структурированное  хамство поощрять?

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

DetSimen пишет:

Весь код чуть менее чем полностью похож на авно. 

Я не хамил, а высказывал своё мнение.  Посылать стал первым - ТС. 

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

DetSimen пишет:

DetSimen пишет:

Весь код чуть менее чем полностью похож на авно. 

Я не хамил, а высказывал своё мнение.  Посылать стал первым - ТС. 

Дед, к тебе вообще вопросов нет, ты предложил, человек сказал, что "этот гвоздь не в ту стену", после этого ответа его уровень понятен даже новичку который хотя бы немного программирует (КАК Я ;-))) )...