Таймер и ШИМ

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

SERgunCHIK пишет:

и как дописать защиту от дребезга, не применяя delay

Статья про разные способы защиты от дребезга. И программные, и аппаратные - http://arduino.ru/forum/obshchii/drebezg-mozhet-komu-nibud-prigoditsya

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Вы, ЕвгенийП, видимо легко читаете англицкий....

Вторая причина - примеры софтверного подавления дребезга явно не дуиновские...

Может для многих тут это все и не проблема.... ... но не для меня.

 

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

Мне всё равно на каком языке читать: русском или английском. А примеры - так они общие примеры, они показывают идею используемых техник, а под конкретную среду надо писать самому. Но идеи там здравые. Не единственно возможные, но здравые. И совет уходить от популярных частот помех тоже правильный.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Проблему дребезга я пока отложил в сторону (видимо решу ее хардверно).

Написал алгоритм долива воды, но как-то коряво выглядит.

Не поможете оптимизировать?


#define WATER_COUNTER 2    
#define WATER_VALWE 4 
#define WATER_BANK 22   
#define WATER_SAMP_IN_HI 24   
#define WATER_SAMP_OUT_HI 26 
#define WATER_SAMP_OUT_NORM 28  
#define WATER_SAMP_OUT_LOW 30 
int waterCounter = 0;   
byte waterLine = 0;
byte waterCountState = 0;       
byte lastWaterCountState = 0;
long int seconds;
//...
void setup() {
 //...
  pinMode(WATER_COUNTER, INPUT_PULLUP);
  pinMode(WATER_BANK, INPUT_PULLUP);
  pinMode(WATER_SAMP_IN_HI, INPUT_PULLUP);
  pinMode(WATER_SAMP_OUT_HI, INPUT_PULLUP);
  pinMode(WATER_SAMP_OUT_NORM, INPUT_PULLUP);
  pinMode(WATER_SAMP_OUT_LOW, INPUT_PULLUP);
  pinMode(WATER_VALWE, OUTPUT);
  Serial.begin(9600);
} 


void loop()
//... 
 {
 waterLine = min(digitalRead(WATER_BANK),digitalRead(WATER_SAMP_IN_HI)); //проверяем уровни воды
 {
 if (seconds >= 36000 && seconds <= 36060 && waterLine >= 1) {    // условие старта долива воды в 10:00 + ограничение долива одной минутой + по уровням норма
  digitalWrite(WATER_COUNTER, HIGH);                                  // открыть клапан
  waterCountState = digitalRead(WATER_COUNTER);    // 
  if (waterCountState != lastWaterCountState) {
    if (waterCountState == HIGH) {
      waterCounter++;                                          // считать литры
      delay(100);
      Serial.println("doliv vodu");
      Serial.print("litrov  ");
      Serial.println(waterCounter);
    } 
  }
   lastWaterCountState = waterCountState;
   
  if (waterCounter >= 10) {
    digitalWrite(WATER_VALWE, LOW);
  } if(seconds <= 36120)
   waterCounter = 0;
  }
}
}

 

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Немного подправил.

Ни как не получается перевести подсчет литров воды в прерывания (ну или как правильно говорится)

#define WATER_COUNTER 2    
#define WATER_VALWE 4 
#define WATER_BANK 22   
#define WATER_SAMP_IN_HI 24   
#define WATER_SAMP_OUT_HI 26 
#define WATER_SAMP_OUT_NORM 28  
#define WATER_SAMP_OUT_LOW 30 
byte waterCounter = 0;   
byte waterLine = 0;
byte waterCountState = 0;       
byte lastWaterCountState = 0;
long int seconds;
//...
void setup() {
 //...
  pinMode(WATER_COUNTER, INPUT_PULLUP);
  pinMode(WATER_BANK, INPUT_PULLUP);
  pinMode(WATER_SAMP_IN_HI, INPUT_PULLUP);
  pinMode(WATER_SAMP_OUT_HI, INPUT_PULLUP);
  pinMode(WATER_SAMP_OUT_NORM, INPUT_PULLUP);
  pinMode(WATER_SAMP_OUT_LOW, INPUT_PULLUP);
  pinMode(WATER_VALWE, OUTPUT);
  Serial.begin(9600);
} 
//...
void loop()
//... 
 {
 waterLine = min(digitalRead(WATER_BANK),digitalRead(WATER_SAMP_IN_HI))*digitalRead(WATER_SAMP_OUT_HI); //проверяем уровни воды
 if (seconds >= 36000 && seconds <= 36060 && waterLine >= 1) {              // условие старта долива воды (в 10:00 + ограничение долива 1 мин + по уровням норма)
  digitalWrite(WATER_COUNTER, HIGH);                                        // открыть клапан
  waterCountState = digitalRead(WATER_COUNTER);                             //  следим за счетчиком
  if (waterCountState != lastWaterCountState && waterCountState == HIGH) {
      waterCounter++;                                                       // считать литры
      delay(10);
    //  Serial.println("doliv vodu");
    //  Serial.print("litrov  ");
    //  Serial.println(waterCounter);
  }
   lastWaterCountState = waterCountState;
if (waterCounter >= 10 || seconds || 36060 || waterLine < 1 )               // если отсчитали 10 литров или прошла минута или переполнение воды
    digitalWrite(WATER_VALWE, LOW);                                         // закрыть клапан
  } if(seconds <= 36120)
   waterCounter = 0;                                                        // сбросить счетчик воды
}

Может хоть кто-то, кому не сложно поможет?