Включение по условию

Тема в разделе "Arduino & Shields", создана пользователем Naher90, 25 июл 2017.

  1. Naher90

    Naher90 Нуб

    Всем привет! Прошу помощи. Пожалуйста, очень надо разобраться, так как сам мало волоку в этом деле пока что.

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

    2 пин это концевик.

    Так вот, как заставить программу работать: 1.чтобы она начинала как бы отстчёт с размыкания концевика.

    2. как сделать чтобы эти циклы не повторялись постоянно с зажатым концевиком.

    Спасибо за советы и подсказски. Всем добра!!
    Вот код:
    Код (C++):
    int analogInput = 0;
    float vout = 0.0;
    float vin = 0.0;
    #define R1  62. // сопротивление R1 (62K)
    #define R2  3.3 // сопротивление R2 (3.3K)
    int value = 0;
    void setup(){
      Serial.begin(9600);
      pinMode(analogInput, INPUT);
      pinMode(2,OUTPUT);
      pinMode(3,INPUT);
    }
    void loop(){
     
    value = analogRead(analogInput);
    vin = ((float)analogRead(A1))*5. / 1024. / R2 * (R1 + R2);
    Serial.print("U1 = ");
    delay(1000);  
    Serial.print(vin, 1);
    delay(1000);
     
    {
       
    if ((digitalRead(3)==HIGH)&& (vin>0.0))//напряжение больше нуля, сообщает что всё нормально и пищит два раза
       
    {
      digitalWrite(2,HIGH);
      delay(100);
      digitalWrite(2,LOW);
      delay(100);
      digitalWrite(2,HIGH);
      delay(100);
      digitalWrite(2,LOW);
      delay(100);
    }
       if ((digitalRead(3)==HIGH)&& (vin==0))//напряжение не включено, сообщает длинным писком, чтобы включить напряжение обратно
       {
        digitalWrite(2,HIGH);
        delay(2000);
        digitalWrite(2,LOW);
        }
        }
    }
     
  2. fogary

    fogary Гик

    Если пин №2 - это концевик, то почему он настроен на выход ( pinMode(2,OUTPUT); )?

    Для чего нужна переменная value, если ее значение нигде не используется?

    Зачем каждый раз в цикле вычислять значение R1 + R2, если оно константа?

    При включении МК, напряжение на входе A1 есть или нет, или не известно?
     
  3. Naher90

    Naher90 Нуб

    И
    Извиняюсь, концевик 3 пин., а напряжение он измеряет, толь ко когда нажимается концевик и сравнивает его отсутствие или присутствие. Как заставить ждать цикл до следующего размыкания концевика? Не повторяя цикл. А запуская его только когда замыкает концевик?
     
  4. fogary

    fogary Гик

    Так до конца и не понял, контроль напряжения нужен только в момент замыкания концевика, или пока он замкнут?

    По существу вопроса, добавьте логическую переменную и выполняйте действия только когда ее состояние меняется. Примерно так:
    Код (C++):
    bool vinLost = true;

    ...
    if ((vin > 0) && vinLost) {
      vinLost = false;
      ...
    } else if ((vin == 0) && !vinLost) {
      vinLost = true;
      ...
    }
     
    Последнее редактирование: 25 июл 2017
    Naher90 нравится это.
  5. Naher90

    Naher90 Нуб

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

    Спасибо Большое, ночь впереди, буду пытать Arduino))
     
    Последнее редактирование: 25 июл 2017
  6. Naher90

    Naher90 Нуб


    Здравствуй, дорогой друг. Я немного по твоему совету пошаманил над кодом.
    Получилось на мой взгляд попроще даже.
    Но вот незадача у меня всё идёт по кругу в loop'е. Подскажи пожалуйста над некоторыми моментами :
    проблемы выделил в комментариях в void loop():

    Код (C++):
    const int konc = 3;
    int analogInput = 0;
    float vout = 0.0;
    float vin = 0.0;
    #define R1  62. // сопротивление R1 (62K)
    #define R2  3.3 // сопротивление R2 (3.3K)
    int value = 0;
    int Koncevik = 0;

    void setup(){
      Serial.begin(9600);
      pinMode(analogInput, INPUT);
      pinMode(2,OUTPUT);
      pinMode(konc,INPUT);
    }

    void loop(){
     
    while( Koncevik == 0){
      Koncevik = digitalRead(konc);

    delay(500);                 //вот здесь всё пищание
    digitalWrite(2, HIGH);//повторяется при
    delay(100);
    digitalWrite(2,LOW);//открытой так сказать двери
    delay(70);
    digitalWrite(2,HIGH);
    delay(100);
    digitalWrite(2,LOW);}

    while(Koncevik == 1){
      Koncevik = digitalRead(konc);
    value = analogRead(analogInput);
    vin = ((float)analogRead(A1))*5. / 1024. / R2 * (R1 + R2);
    Serial.print("U1 = ");
    delay(1000);  
    Serial.print(vin, 1);
    delay(1000);

    if ((digitalRead(konc)==1) && (vin>0)){
       digitalWrite(2,HIGH);//это условие выполняется
        delay(100);//ровно, но только тоже зациклено
        digitalWrite(2,LOW);
        delay(100);
    }
      else if ((digitalRead(konc)==1) && (vin==0)){
        digitalWrite(2,HIGH);// с этим та же беда
        delay(1000);
        digitalWrite(2,LOW);
        delay(100);
      }
    }
    }
     
     
  7. fogary

    fogary Гик

    Попробуйте такой код:
    Код (C++):
    #define BUZZ_PIN = 2;
    #define KONC_PIN = 3;

    #define R1  62. // сопротивление R1 (62K)
    #define R2  3.3 // сопротивление R2 (3.3K)
    const float CF = 1024.0 / (5.0 * (R1 / R2));

    float v_in = 0.0;
    bool is_koncevik_on = false;

    void setup(){
      Serial.begin(9600);

      pinMode(A1, INPUT);
      pinMode(BUZZ_PIN, OUTPUT);
      pinMode(KONC_PIN, INPUT);
    }

    void loop() {
      if (!digitalRead(KONC_PIN)) {
        is_koncevik_on = false;

        delay(500);
        digitalWrite(BUZZ_PIN, HIGH);
        delay(100);
        digitalWrite(BUZZ_PIN,LOW);
        delay(70);
        digitalWrite(BUZZ_PIN,HIGH);
        delay(100);
        digitalWrite(BUZZ_PIN,LOW);
      } else {
        //v_in = (float)analogRead(A1) * 5. / 1024. / R2 * (R1 + R2);
        v_in = (float)analogRead(A1) / CF;
        Serial.print("U1 = ");
        delay(1000); // зачем тут задержка???
        Serial.print(v_in, 1);
        delay(1000);

        if (!is_koncevik_on) {
          is_koncevik_on = true;
       
          if (v_in > 0) {
            digitalWrite(BUZZ_PIN, HIGH);
            delay(100);
            digitalWrite(BUZZ_PIN, LOW);
            delay(100);
          } else {
            digitalWrite(BUZZ_PIN, HIGH);
            delay(1000);
            digitalWrite(BUZZ_PIN, LOW);
            delay(100);
          }
        }
      }
    }
    Если в строке
    Код (C++):
     v_in = (float)analogRead(A1) / CF;
    будет неверный результат, то эту строку закомментируйте, а перед ней - раскомментируйте.

    Для чего нужно читать analogInput и зачем нужны переменные value и vout - я не понял, поэтому убрал эти места из кода.
     
  8. Naher90

    Naher90 Нуб

    Спасибо огромное, вечером сообщу результат)
     
  9. Naher90

    Naher90 Нуб

    УРААА, Всё замечательно, формулы и моя и Ваша, рабочие=) Спасибо ОгромеННООЕЕЕ, Благодаря тебе верю в Людей и не теряю надежду в изучении языков программирования =) Но вот только при открытии, вот здесь
    Код (C++):
    void loop() {
      if (!digitalRead(KONC_PIN)) {
        is_koncevik_on = false;

        delay(500);
        digitalWrite(BUZZ_PIN, HIGH);
        delay(100);
        digitalWrite(BUZZ_PIN,LOW);
        delay(70);
        digitalWrite(BUZZ_PIN,HIGH);
        delay(100);
        digitalWrite(BUZZ_PIN,LOW);
      } else {
     
    Всё идёт зациклено, а хотел чтобы два раза просто пискнуло и всё. Буду думать что с этим поделать можно)
     
  10. Naher90

    Naher90 Нуб

    Вот доделал, Всё рбаотает. Спасибо Огромное! Век тебя помнить буду. p.s.: немного п
    Код (C++):
    #define BUZZ_PIN  2
    #define KONC_PIN  3

    #define R1  62. // сопротивление R1 (62K)
    #define R2  3.3 // сопротивление R2 (3.3K)
    const float CF = 1024.0 / (5.0 * (R1 / R2));

    float v_in = 0.0;
    bool is_koncevik_on = false;

    void setup(){
      Serial.begin(9600);

      pinMode(A1, INPUT);
      pinMode(BUZZ_PIN, OUTPUT);
      pinMode(KONC_PIN, INPUT);
    }

    void loop() {
     
      if (!digitalRead(KONC_PIN)) {
        if(is_koncevik_on){//добавил, чтобы повторялось всего один раз
        is_koncevik_on = false;

        delay(500);
        digitalWrite(BUZZ_PIN, HIGH);
        delay(100);
        digitalWrite(BUZZ_PIN,LOW);
        delay(70);
        digitalWrite(BUZZ_PIN,HIGH);
        delay(100);
        digitalWrite(BUZZ_PIN,LOW);
      }
      }else {
        v_in = (float)analogRead(A1) * 5. / 1024. / R2 * (R1 + R2);// работают обе, но твоя проще. Спасибо ТЕБЕ! на ошибках учатся
        //v_in = (float)analogRead(A1) / CF;
        Serial.print("U1 = ");
        Serial.print(v_in, 1);
        delay(1000);

        if (!is_koncevik_on) {
          is_koncevik_on = true;
       
          if (v_in > 0) {
            digitalWrite(BUZZ_PIN, HIGH);
            delay(100);
            digitalWrite(BUZZ_PIN, LOW);
            delay(100);
          } else {
            digitalWrite(BUZZ_PIN, HIGH);
            delay(1000);
            digitalWrite(BUZZ_PIN, LOW);
            delay(100);
          }
        }
      }
    }
    оправил