Очень большая задержка digitalRead();

Тема в разделе "Arduino & Shields", создана пользователем Личинус, 27 янв 2017.

  1. Итак, возникла проблема с очень большой задержкой при выполнение функции
    Код (C++):
    if( value2 == LOW) {
    digitalWrite(13,1);
    }
    else {
    digitalWrite(13,0);
    }
    Причем без баунса все также задержка. Подскажите пожалуйста, как сделать так, чтобы приоритет этой функции был выше. Далее будет весь скетч.
    Код (C++):
    #include <Bounce2.h>

    #include <LiquidCrystalRus.h>

    #include "OneWire.h"

    //EEPROM
    #include <EEPROM.h>
    byte sum; // контрольная сумма

    #define pinM A1
    #define pinP A0
    #define pinC A2


    Bounce debouncer = Bounce();
    Bounce debouncer2 = Bounce();
    Bounce debouncer3 = Bounce();

    // OneWire DS18S20, DS18B20, DS1822 Temperature Example
    //
    // http://www.pjrc.com/teensy/td_libs_OneWire.html
    //
    // The DallasTemperature library can do all this work for you!
    // http://milesburton.com/Dallas_Temperature_Control_Library

    OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

    LiquidCrystalRus lcd(3, 4, 5, 6, 7, 8, 9);



    int menu = 1;
    int change = 1;
    int power = 1;


    int relay1 = 25;
    int relay2 = 15;

    void setup(void) {
      Serial.begin(9600);
      //Настройка LCD
      lcd.begin(16, 2);
      lcd.setDRAMModel(LCD_DRAM_WH1601);
      //Ножки ардуино
      //Аналаговые выходы
      pinMode(13, OUTPUT);
      pinMode(A3, OUTPUT);
      pinMode(A4, OUTPUT);
      pinMode(A5, OUTPUT);
      pinMode(A6, OUTPUT);
      //Аналоговые входы

      pinMode(A2, OUTPUT);

      pinMode(pinM, INPUT_PULLUP);
      // After setting up the button, setup the Bounce instance :
      debouncer.attach(pinM);
      debouncer.interval(5); // interval in ms

      pinMode(pinP, INPUT_PULLUP);
      // After setting up the button, setup the Bounce instance :
      debouncer2.attach(pinP);
      debouncer2.interval(1); // interval in ms

      pinMode(pinC, INPUT_PULLUP);
      // After setting up the button, setup the Bounce instance :
      debouncer3.attach(pinC);
      debouncer3.interval(5); // interval in ms

      lcd.clear();
      lcd.setCursor(5, 0);
      lcd.print("Система");
      delay(1000);
      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("УМНЫЙ ГАРАЖ");
      delay(1000);
      lcd.clear();
      lcd.print("Версия 2.28");
      delay(1000);
      lcd.clear();
      lcd.print("RELAY 1 POWER IF");
      lcd.setCursor(0, 1);
      lcd.print(EEPROM.read(relay1));
      lcd.print(" CELSIUS");
      delay(500);
      lcd.clear();
      lcd.print("RELAY 2 POWER IF");
      lcd.setCursor(0, 1);
      lcd.print(relay2);
      lcd.print(" CELSIUS");
      delay(500);

    }





    void loop(void) {

        digitalWrite(13,1);
        delay(500);
        digitalWrite(13,0);
        delay(50);
     
        byte i;
        byte present = 0;
        byte type_s;
        byte data[12];
        byte addr[8];
        float celsius, fahrenheit;

        if ( !ds.search(addr)) {
        ds.reset_search();
        delay(250);
        return;
        }

        Serial.print("");
        for( i = 0; i < 8; i++) {
        }

        if (OneWire::crc8(addr, 7) != addr[7]) {
        return;
        }

        // the first ROM byte indicates which chip
        switch (addr[0]) {
        case 0x10:
        type_s = 1;
        break;
        case 0x28:
        type_s = 0;
        break;
        case 0x22:
        type_s = 0;
        break;
        default:
        return;
        }

        ds.reset();
        ds.select(addr);
        ds.write(0x44, 1);        // start conversion, with parasite power on at the end

        delay(75);     // maybe 750ms is enough, maybe not
        // we might do a ds.depower() here, but the reset will take care of it.

        present = ds.reset();
        ds.select(addr);
        ds.write(0xBE);         // Read Scratchpad

        for ( i = 0; i < 9; i++) {           // we need 9 bytes
        data[i] = ds.read();
        }


        // Convert the data to actual temperature
        // because the result is a 16 bit signed integer, it should
        // be stored to an "int16_t" type, which is always 16 bits
        // even when compiled on a 32 bit processor.
        int16_t raw = (data[1] << 8) | data[0];
        if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // "count remain" gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
        }
        else {
        byte cfg = (data[4] & 0x60);
        // at lower res, the low bits are undefined, so let's zero them
        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        //// default is 12 bit resolution, 750 ms conversion time
        }



        celsius = (float)raw / 16.0;
        fahrenheit = celsius * 1.8 + 32.0;
        Serial.println("");
        Serial.print("  Temperature = ");
        Serial.print(round((celsius+random(celsius+1, celsius-1))/2+0.25));
        Serial.print(" Celsius; ");
        Serial.println("");
        Serial.print("RELAY1 = ");
        Serial.print(EEPROM.read(relay1));
        Serial.print(" Celsius ");
        Serial.println();
        Serial.print("RELAY2 = ");
        Serial.print(relay2);
        Serial.print(" Celsius ");
        Serial.println();

        //LCD INDICATION
        lcd.clear();
        lcd.print("Температура ");
        lcd.print(round((celsius+random(celsius+1, celsius-1))/2+0.25));
     

      //MENU
     
        debouncer.update();
        debouncer2.update();
        debouncer3.update();
        int value1 = debouncer.read();
        int value2 = debouncer2.read();
        int value3 = debouncer3.read();

       
        if (digitalRead(A2) == LOW) {
        digitalWrite(A3,1);
        }
        else{
          digitalWrite(A3,0);
        }
     

      if ( value1 == LOW) {
        lcd.clear();
        delay(100);
        lcd.print("Система выключена");
        delay(500);
      }
     
    }
     
     
  2. rkit

    rkit Гуру

    У вас в лупе чересчур много работы. Вам нет нужды делать это все так часто.
     
  3. sslobodyan

    sslobodyan Гик

    Только здесь вы тратите впустую более полусекунды. А дальше по коду тоже какая-то мешанина. Сложно сообразить что там предполагалось сделать.
    Задержки как выше лучше делать на контроле времени, а не на delay:
    Код (C++):

    uint32_t tm=0;
    loop() {
    if (tm>0) {
      if (millis() > tm) {
        // выключаемся
        digitalWrite(LOW)...
        // сбрасываем отсчет времени
        tm = 0;
      }
    } else {
      tm = millis() + 500; //
      // включаемся
      digitalWrite(HIGH)....
    }