Время работы по включению и выключению

ard-20
Offline
Зарегистрирован: 05.10.2020

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

 

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

А смысл?

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

1000р

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

Денег 0  и не намечается 

 

ard-20
Offline
Зарегистрирован: 05.10.2020

Пока тренируюсь . Подаю с другой ардуинки о или 5 вольт с задержкой 5 сек и пытаюсь в порт вывести время 

 

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

ard-20 пишет:

Денег 0  и не намечается 

тогда пиши сам. Будут вопросы (по написанию ) - задавай, но код за тебя тут никто писать не станет.

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

Читай постоянно пин, запоминай в переменной millis() момента активности. Потом бери пример "blink без delay", ищи в нем условие сравнения прошедшего времени с заданным промежутком. В своём варианте сделаешь два условия - на 5 и на 10 сек. Под условиями дёрнешь релюшку и врубишь сирену.

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

sadman41 пишет:

Читай постоянно пин, запоминай в переменной millis() момента активности. Потом бери пример "blink без delay", ищи в нем условие сравнения прошедшего времени с заданным промежутком. В своём варианте сделаешь два условия - на 5 и на 10 сек. Под условиями дёрнешь релюшку и врубишь сирену.

А чего его постоянно считать, настроить на прерывание и пусть в лупе крутится

Гриша
Offline
Зарегистрирован: 27.04.2014

ua6em пишет:

А чего его постоянно считать, настроить на прерывание и пусть в лупе крутится

та... нее... задача для новичка и решение для новичка, если бы ТС знал прерывания - вопроса бы и не было. 

пусть с миллисами поиграется. Задачка чисто в логике - решит ее, может толк и выйдет...

или уже вышел и осталась только ......   

как сможет вопрос грамотно поставить, так и дело стронется, а направление на миллис. 

Гриша
Offline
Зарегистрирован: 27.04.2014

del

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

ard-20 пишет:

Пока тренируюсь . Подаю с другой ардуинки о или 5 вольт с задержкой 5 сек и пытаюсь в порт вывести время 

 

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

Honey
Offline
Зарегистрирован: 01.10.2020

Могу подарить свой код "двоичного осцилографа", МК с равномерной частотой делает опрос порта, и отправляет по UART (т.е. побитно копирует, добавляя старт/стоп биты). На ПК программа это читает и пишет в лог сколько времени был "0" и сколько "1". Использую для отладки протоколов.

Гриша
Offline
Зарегистрирован: 27.04.2014

ard-20 пишет:

Пока тренируюсь . Подаю с другой ардуинки о или 5 вольт с задержкой 5 сек и пытаюсь в порт вывести время 

для информации - слишком часто выводить в порт плохо. Необходимо написать программу так, чтобы в порт выводилось не чаще 1 раза в 5 секунд (можно реже). использовать delay - запрещено!  

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

ard-20
Offline
Зарегистрирован: 05.10.2020
boolean state_A = 0; // Переменная для хранения состояния вывода
boolean state_B = 0; // Переменная для хранения состояния вывода
boolean state_C = 0; // Переменная для хранения состояния вывода

unsigned long new_millis_A = millis(); // Переменная для хранения времени
unsigned long new_millis_B = millis(); // Переменная для хранения времени
unsigned long new_millis_C = millis(); // Переменная для хранения времени

#define TIME_ON_A 5000  // Время в течении, которого на выводе 1
#define TIME_OFF_A 7000 // Время в течении, которого на выводе 0

#define TIME_ON_B 5000  // Время в течении, которого на выводе 1
#define TIME_OFF_B 7000 // Время в течении, которого на выводе 0

#define TIME_ON_C 5000  // Время в течении, которого на выводе 1
#define TIME_OFF_C 7000 // Время в течении, которого на выводе 0

void setup() {
  
  pinMode(5,OUTPUT); // Настраиваем вывод на выход
  pinMode(6,OUTPUT); // Настраиваем вывод на выход
  pinMode(7,OUTPUT); // Настраиваем вывод на выход
  Serial.begin(9600);
  }
void loop(){ 
  
// Управление фазой А:
  if(millis() > new_millis_A){
    state_A = !state_A;
    digitalWrite(5, state_A);
    if(state_A){
      new_millis_A = millis() + TIME_ON_A;
     
    }
    else{
      new_millis_A = millis() + TIME_OFF_A;
    
    }
  }

  // Управление фазой В:
  if(millis() > new_millis_B){
    state_B = !state_B;
    digitalWrite(5, state_B);
    if(state_B){
      new_millis_B = millis() + TIME_ON_B;
    }
    else{
      new_millis_B = millis() + TIME_OFF_B;
    }
  }
  
   // Управление фазой C:
  if(millis() > new_millis_C){
    state_C = !state_C;
    digitalWrite(5, state_C);
    if(state_B){
      new_millis_C = millis() + TIME_ON_C;
    }
    else{
      new_millis_C = millis() + TIME_OFF_C;
    }
  }
}

 

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

Это код с меги принимаю с нано и сравниваю с периодом 5 сек. Собрал как смог. Пока не могу разобраться как все-таки именно посчитать сколько времени нет фазы и как это вывести на дисплей.

 

ard-20
Offline
Зарегистрирован: 05.10.2020

###

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

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

ard-20
Offline
Зарегистрирован: 05.10.2020

Понимаю что нужен обработчик прерываний. Т о есть создать глобальную переменную и в обработчике добавлять по 1 мс  а потом играться с if 5 сек и обрыв ( обрыв может быть сколько угодно времени вот его как- то надо определить и вывести на дисплей )

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

ard-20
Offline
Зарегистрирован: 05.10.2020

###

Гриша
Offline
Зарегистрирован: 27.04.2014

ard-20 пишет:

Это код с меги принимаю с нано и сравниваю с периодом 5 сек. Собрал как смог. Пока не могу разобраться как все-таки именно посчитать сколько времени нет фазы и как это вывести на дисплей.

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

если в посте 15 есть нечто разумное, то в посте 16 с этим сложности.

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

###

Гриша
Offline
Зарегистрирован: 27.04.2014

И вообще, сперва с одной фазой разберитесь, а потом клонируйте алгоритм... это тоже будет отдельной задачей. И... у вас в условии алгоритм системы с распределенными параметрами, а это не так просто как кажется (если придираться к скорости обработки)... но вам до этого как до Китая... 

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

ard-20 пишет:

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

то что вы описываете - в Ардуино уже сделано за вас - функция millis() каждую миллисекунду увеличивается на 1

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

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

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

  Считает время 0 и 1 правильно . Подскажите пожалуйста как вывести в порт по окончанию счета 1 раз ?

дожно считать ?


unsigned long Global_tik = millis(); // Переменная для хранения времени
unsigned long faz_OK =0; // Переменная для хранения времени
unsigned long faz_NO= 0; // Переменная для хранения времени
unsigned long time_faz_OK =0; // Переменная для хранения времени
unsigned long time_faz_NO= 0; // Переменная для хранения времени

bool a,b;
void setup() {
 pinMode(5,INPUT); // Настраиваем вывод на вход
 Serial.begin(9600);
}

void loop() {

   if ( digitalRead (5) == LOW ){
   time_faz_NO = millis() - faz_NO;
   
   }
   else {
    faz_NO = millis();
    Serial.println(time_faz_NO/1000);
     
    }
   
  if ( digitalRead (5) == HIGH){
  
    time_faz_OK = millis() - faz_OK;
    }
  else {
    faz_OK = millis();
    Serial.println(time_faz_OK/1000); 
    }
    
}
   

 

ard-20
Offline
Зарегистрирован: 05.10.2020

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


unsigned long Global_tik = millis(); // Переменная для хранения времени
unsigned long faz_OK =0; // Переменная для хранения времени
unsigned long faz_NO= 0; // Переменная для хранения времени
unsigned long time_faz_OK =0; // Переменная для хранения времени
unsigned long time_faz_NO= 0; // Переменная для хранения времени

int a,b;
void setup() {
 pinMode(5,INPUT); // Настраиваем вывод на вход
 Serial.begin(9600);
}

void loop() {
   unsigned long Global_tik = millis();
   
   if ( digitalRead (5) == LOW ){
   time_faz_NO = Global_tik - faz_NO;
   
   }
    else{ 

      if (time_faz_NO >= 5000){
        a=1;}
        else{a=0;
        }
      
    faz_NO = Global_tik;
   
     
    }
   
 /*/ if ( digitalRead (5) == HIGH){
  
    time_faz_OK = Global_tik - faz_OK;
    }
  else {
    faz_OK = Global_tik;
    Serial.println(time_faz_OK/1000); 
    } */
    if ( a == 1){
      a=0;
               Serial.println("ERROR FAZ");
                Serial.println(time_faz_NO/1000);}
}
   

 

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

Используй флаги!

ard-20
Offline
Зарегистрирован: 05.10.2020

не могу понять как его применить

 

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

ard-20 пишет:

не могу понять как его применить

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

ard-20
Offline
Зарегистрирован: 05.10.2020

###

nik182
Offline
Зарегистрирован: 04.05.2015

А слабо флаг обнулить после первого вывода?

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

nik182 пишет:

А слабо флаг обнулить после первого вывода?

так он его нулит, он флаг, что вывел не устанавливает

Гриша
Offline
Зарегистрирован: 27.04.2014

привет, пост 30 :

1) чего компилятор говорит про строки 1 и 14? 

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

ard-20
Offline
Зарегистрирован: 05.10.2020

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

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

ard-20 пишет:
А вот куда ставить флаги

Можно прям Ардуине на корпус клеить

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

ard-20 пишет:

Понимаю что нужен обработчик прерываний. Т о есть создать глобальную переменную и в обработчике добавлять по 1 мс  а потом играться с if 5 сек и обрыв ( обрыв может быть сколько угодно времени вот его как- то надо определить и вывести на дисплей )

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

Этот обработчик прерываний собственно уже есть.
Тот самый millis()

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

ard-20 пишет:

А вот куда ставить флаги пока чтоб выводило 1 раз пока не пойму. Ставил уже куда только мог.

я не пойму, вы типа в "своем" коде ни строчки не понимаете, что ли? Может отложить задачку на пару месяцев и книжки почитать?

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

Не помогает на корпус ?

ard-20
Offline
Зарегистрирован: 05.10.2020

Я бы отложил если не надо было

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

ard-20 пишет:

Я бы отложил если не надо было


Не врите , вам не надо.
Если бы было надо, то воспользовались бы предложением в сообщении #3

ard-20
Offline
Зарегистрирован: 05.10.2020

Kakmyc пишет:
ard-20 пишет:

Я бы отложил если не надо было

Не врите , вам не надо. Если бы было надо, то воспользовались бы предложением в сообщении #3
 

Как говорят были бы деньги был бы рай . А их нет (!)

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

ard-20 пишет:

Как говорят были бы деньги был бы рай . А их нет (!)

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

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

ard-20 пишет:

Как говорят были бы деньги был бы рай . А их нет (!)

тогда читать книжки два месяца.

Было бы действительно "надо" - деньги бы нашлись. Сумма не запредельная.

 

Как говорится - "проблемы, которые можно решить за деньги - это вовсе не проблемы, это просто расходы"

ard-20
Offline
Зарегистрирован: 05.10.2020

Судя по всему через пару дней читать уже не надо будет . 

ard-20
Offline
Зарегистрирован: 05.10.2020

Вопрос : Как тему закрыть в форуме ?

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

ard-20 пишет:

Вопрос : Как тему закрыть в форуме ?

Попросить меня, я удалю. :)