<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; 3 таймера]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=621&amp;type=atom" />
	<updated>2024-03-09T11:40:34Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=621</id>
		<entry>
			<title type="html"><![CDATA[3 таймера]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=9655#p9655" />
			<content type="html"><![CDATA[<p>Добрый день!</p><p>на другом форуме человек обратился с просьбой помочь со схемой управления какого то процесса, которая должна обеспечить следующий алгоритм работы</p><p>- нажимается кнопка &quot;пуск&quot;<br />- зажигается светодиод оптопары, дает разрешение на работу процесса и ждет сигнала от датчика<br />- по истечении 500мс, если ничего не происходит, светодиод(разрешение процесса) должен выключится и включиться регулируемая потенциометром пауза длительностью 0.5 - 4 сек, после чего все повторяется (если кнопка &quot;пуск&quot; остается нажатой)<br />- пока есть разрешение(горит светодиод), если пришел сигнал с датчика, должно включиться реле на регулируемое вторым потенциометром время от 10мс до 500мс и затем также включается пауза 0.5-4сек<br />- режим &quot;паза&quot; наступает в любом из следующих случаев, который произойдет раньше:<br />1. отпускание кнопки &quot;пуск&quot;<br />2. истечение времени 500мс, после нажатия и длительного удержания кнопки &quot;пуск&quot;(если ничего не происходит) <br />3. истечение времени 10мс - 500мс после прихода сигнала с датчика</p><p>после окончания паузы 0.5-4 сек если кнопка &quot;пуск&quot; не нажата ничего не происходит, если нажата, то цикл повторяется</p><p>согласно алгоритму я &quot;родил&quot; скетч программы и нарисовал схему</p><br /><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/03/0f0f208b3ca3dacd382d4767c712069b.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2024/03/0f0f208b3ca3dacd382d4767c712069b.jpg" /></span> </p><div class="codebox"><pre><code>//       !!!ВНИМАНИЕ!!!
//пины ввода/вывода можно заменить на любые удобные
//только в строках #define !!!
//кроме А0 и А1 - их можно менять на любые аналоговые

#define PUSK_PIN 8      // номер вывода кнопки &quot;пуск&quot;
#define DATCHIK_PIN 9   // номер вывода сигнала датчика 
#define LedPUSK_PIN 10  // номер вывода светодиода &quot;пуск&quot;
#define LedPAUSA_PIN 11 // номер вывода светодиода &quot;пауза&quot;
#define RELE_PIN 12     // номер вывода светодиодa c реле

unsigned long tmr ;     // переменная таймера
unsigned long tmr1 ;    // переменная таймера1

void setup() {
  pinMode(PUSK_PIN, INPUT_PULLUP);    // кнопка пуск
  pinMode(DATCHIK_PIN, INPUT_PULLUP); // !!!сигнал с датчика-&quot;0&quot;!!!
  pinMode(LedPUSK_PIN, OUTPUT);       // индикация пуска
  pinMode(LedPAUSA_PIN, OUTPUT);      // индикация паузы
  pinMode(RELE_PIN, OUTPUT);          // реле и светодиод
}
void loop() {
  if ( digitalRead(PUSK_PIN) == LOW ) //если кнопка пуск нажата
  { delay(20);                  //задержка на дребезг контактов
    digitalWrite(LedPUSK_PIN, HIGH);  // вкл. светодиода &quot;пуск&quot;

    tmr = millis();
tmr:
    if (millis() - tmr &lt; 500) //время включенного светодиода &quot;пуск&quot;
    {
      if ( digitalRead(PUSK_PIN) == HIGH) //пауза если отжата &quot;пуск&quot;
      {
        goto pauza;
      }
      if ( digitalRead(DATCHIK_PIN) == LOW) //если есть сигнал датчика
      {
        digitalWrite(RELE_PIN, HIGH);      // вкл.реле и светодиода

 //время на отключение реле регулировка(мс) переменным резистором
        int t1 =  analogRead(A1) / 2 ;
        tmr1 = millis();
tmr1:
        if (millis() - tmr1 &gt; t1 or
            digitalRead(PUSK_PIN) == HIGH)
        {
          goto pauza;
        }
        goto tmr1;
      }
      goto tmr;
    }
pauza:
    digitalWrite(LedPUSK_PIN, LOW);  // выкл. светодиода &quot;пуск&quot;
    digitalWrite(RELE_PIN, LOW);      //выключение реле
    digitalWrite(LedPAUSA_PIN, HIGH); //индикация паузы
    //регулировка паузы(мс) переменным резистором
    int t0 = 4 * analogRead(A0);
    delay(t0);                         //время паузы
    digitalWrite(LedPAUSA_PIN, LOW);  //конец паузы
  }
}</code></pre></div><br /><p><span class="bbu">все работает! человек остался доволен</span></p><div class="quotebox"><blockquote><p>То что Вы сотворили просто конструктор и очень легко настраиваемый и понимаемый. Такого в интернете я нигде не находил когда искал.</p></blockquote></div><br /><p>но... <strong><span class="bbu">недоволен я</span></strong></p><br /><p>я&nbsp; в программировании профаном себя уже не считаю, но и до программиста мне еще далеко, скажем так я себя оцениваю в программировании как Дилетант(с большой буквы <img src="http://forum.rcl-radio.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /> )</p><p>объясните мне пожалуйста, если не трудно, почему в строках программы</p><p>if (millis() - tmr &lt; 500)</p><p>и</p><p>if (millis() - tmr1 &gt; t1</p><p>которые выполняют в общем то одинаковые действия, для правильной отработки выдержки в первом случае мне пришлось ставить &quot;&lt;&quot;(воспользовавшись методом &quot;научного тыка&quot;),&nbsp; а во втором &quot;&gt; &quot; ???</p><p>у меня уже мозги &quot;кипят&quot; - не понимаю <img src="http://forum.rcl-radio.ru/img/smilies/sad.png" width="15" height="15" alt="sad" /></p><br /><p>и еще, как можно было бы обойтись в данном алгоритме&nbsp; без&nbsp; &quot;goto&quot;?<br />мне без них не удалось реализовать поставленную задачу <img src="http://forum.rcl-radio.ru/img/smilies/sad.png" width="15" height="15" alt="sad" /></p>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2024-03-09T11:40:34Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=9655#p9655</id>
		</entry>
</feed>
