Нужна подсказка о том как прописать длительность исполнения функции

stryzhak
Offline
Зарегистрирован: 28.05.2015

Здравствуйте друзья!
Создал свой первый проект для полива участка. Использую, кроме всего, две сервы. Так как, серва после поворота продолжает "гудеть", дабы серва не испортилась, решил использовать команду detach(), ну а для того что б серва успела повернуть кран, использовал функцию delay().
Но вот незадача, на длительность задержки зависает ВСЯ программа, а не только серва.
Великие "гуру" и учителя, подскажите пожалуйста можно ли как то заставить серву работать некоторое время, не приводя всю программу в ступор.

спасибо

с уважение Анатолий

#include <Servo.h>
#include "DHT.h"
#define DHTPIN 4
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
Servo servoa;
Servo servob;
int ButtonPin1 = 6;
int ButtonPin2 = 7;
int servoPin1 = 10;
int servoPin2 = 11;
int ledPin1 = 13;
int ledPin2 = 12;
int RelayPin = 8; //на реле 220Вольт
int Area1 = 1;
int Area2 = 0;
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup()
{

  Serial.begin(9600);
  dht.begin();
  //servoa.attach(servoPin1);
  //servob.attach(servoPin2);
  pinMode(ButtonPin1, INPUT);
  pinMode(ButtonPin2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(RelayPin, OUTPUT);
  
   
}
void loop(){
  temp();
  time();
  lcd();
  float h = dht.readHumidity();
  delay(500);
  float t = dht.readTemperature();
  delay(500);
  if(h<80 || t>-1 )
  {
   relay();
   buttons();
   serial();
   
}
  else 
  {
    Serial.println("It`s too much rain today");
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(RelayPin, LOW);
    Area1 = 1;
    Area2 = 0;
  }
  
}
void relay()
{
  if (Area1 == 0 || Area2 == 1) {
  digitalWrite(RelayPin, HIGH);
  }
  else 
  {
  digitalWrite(RelayPin, LOW);
  }
}
void lcd() {
  float h = dht.readHumidity();
  delay(20);
  float t = dht.readTemperature();
  delay(20);
  tmElements_t tm;
  if (RTC.read(tm))
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print(h);
  display.print("% ");
  display.setTextSize(1);
  display.setCursor(40,0);
  display.print(t);
  display.println("*C");
  display.setTextSize(2);
  display.setCursor(0,20);
  display.println(tm.Hour);
  display.setTextSize(2);
  display.setCursor(30,20);
  display.println(tm.Minute);
  display.setTextSize(2);
  display.setCursor(60,20);
  display.println(tm.Second);
  if (Area1 ==1) {
    display.setTextSize(1);
    display.setCursor(0,40);
    display.println("Area1 OFF");
  }
  else {
  display.setTextSize(1);
    display.setCursor(0,40);
    display.println("Area1 ON");
  }
  if (Area2 ==0) {
    display.setTextSize(1);
    display.setCursor(0,50);
    display.println("Area2 OFF");
  }
  else {
  display.setTextSize(1);
    display.setCursor(0,50);
    display.println("Area2 ON");
  }
  if(h>80 || t<-1){
    display.setTextSize(2);
    display.setCursor(90,10);
    display.println("OFF");
  }
  else {
    display.setTextSize(3);
    display.setCursor(90,10);
    display.println("ON");
  }
  if (Area1 == 0 || Area2 == 1)
   {
    display.setTextSize(1);
    display.setCursor(60,40);
    display.println("Pump ON");
    } 
    else 
    {
    display.setTextSize(1);
    display.setCursor(60,40);
    display.println("Pump OFF"); 
    }
  display.display();
  
}  
void time() {
  
 tmElements_t tm;
 
 if (RTC.read(tm)) 
 {
  print2digits(tm.Hour);
  Serial.write(':');
  print2digits(tm.Minute);
  Serial.write(':');
  print2digits(tm.Second);
  Serial.print(" ");
  Serial.print(tm.Day);
  Serial.write('/');
  Serial.print(tm.Month);
  Serial.write('/');
  Serial.print(tmYearToCalendar(tm.Year));
  Serial.println();
  delay(50);
  } 
}
 
void print2digits(int number) 
{
 if (number >= 0 && number < 10) 
 {
  Serial.write('0');
 }
 Serial.print(number);
}

void temp(){
  float h = dht.readHumidity();
  delay(20);
  float t = dht.readTemperature();
  delay(20);
  if (isnan(t) || isnan(h)) {
    Serial.println("Error reading DHT");
  } else {
    Serial.print(h);
    Serial.print("% ");
    Serial.print(t);
    Serial.println("*C");
  }
}
  
void serial() {
    if (Serial.available()) {
    int ser = Serial.read() -'0' ;
    if(ser == 1){
     Serial.println("Area1 pour ON, Pump is ON");
     digitalWrite(ledPin1, HIGH);
     Area1 = 0;
     servoa.attach(servoPin1);
     servoa.write(0);
     delay(500);
     servoa.detach();
     
     }
  else if (ser == 2)
    {
    Serial.println("Area1 pour OFF, Pump is OFF");
    digitalWrite(ledPin1, LOW);
    Area1 = 1;
    servoa.attach(servoPin1);
    servoa.write(80);
    delay(500);
    servoa.detach();
    
    }
   else if(ser == 3){
     Serial.println("Area2 pour ON, Pump is ON");
     digitalWrite(ledPin2, HIGH);
     Area2 = 1;
     servob.attach(servoPin2);
     servob.write(0);
     delay(500);
     servob.detach();
     
     }
   else if (ser == 4)
    {
    Serial.println("Area2 pour OFF, Pump is OFF");
    digitalWrite(ledPin2, LOW);
    Area2 = 0;
    servob.attach(servoPin2);
    servob.write(85);
    delay(500);
    servob.detach();
    
    }
    else
    {
    Serial.println("Invaild comand");
    }
    Serial.flush();
 }
}

void buttons() {
  if ( digitalRead(ButtonPin1) == HIGH && Area1 == 1)
  {
    Serial.println("Area1 pour ON, Pump is ON");
    digitalWrite(ledPin1, HIGH);
    Area1 = 0;
    servoa.attach(servoPin1);
    servoa.write(0);
    delay(500);
    servoa.detach();
    delay(400);
  }
  if ( digitalRead(ButtonPin1) == HIGH && Area1 == 0)
  {
    Serial.println("Area1 pour OFF, Pump is OFF");
    digitalWrite(ledPin1, LOW);
    Area1 = 1;
    servoa.attach(servoPin1);
    servoa.write(80);
    delay(500);
    servoa.detach();
    delay(400);
  }
if ( digitalRead(ButtonPin2) == HIGH && Area2 == 0)
  {
    Serial.println("Area2 pour ON, Pump is ON");
    digitalWrite(ledPin2, HIGH);
    Area2 = 1;
    servob.attach(servoPin2);
    servob.write(0);
    delay(500);
    servob.detach();
    delay(400);
  }
  if ( digitalRead(ButtonPin2) == HIGH && Area2 == 1)
  {
    Serial.println("Area2 pour OFF, Pump is OFF");
    digitalWrite(ledPin2, LOW);
    Area2 = 0;
    servob.attach(servoPin2);
    servob.write(85);
    delay(500);
    servob.detach();
    delay(400);
  }
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

есть тема про мигание светодиодом без delay.

ну пусть себе зависает, или самолет из штопора не успеет выйти ?

чтобы не дергалась я поставил релюшку на питание серв и подаю питание только, когда надо.

ето какая же серва нужна, чтобы кран (шаровый ? ) провернуть....

поставьте электромагнитный клапан и не парьтесь с сервами...

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Примеры->BlinkWithoutDelay

stryzhak
Offline
Зарегистрирован: 28.05.2015

inspiritus пишет:

поставьте электромагнитный клапан и не парьтесь с сервами...

В принципе я так и собираюсь сделать, но все же вопрос интересно решить!

Кстати серва действительно кран поворачивает.

stryzhak
Offline
Зарегистрирован: 28.05.2015

Yarik.Yar пишет:

Примеры->BlinkWithoutDelay

 

спасибо друзья я посмотрю эту тему

Maxann
Offline
Зарегистрирован: 29.05.2015

stryzhak пишет:

inspiritus пишет:

поставьте электромагнитный клапан и не парьтесь с сервами...

В принципе я так и собираюсь сделать, но все же вопрос интересно решить!

Кстати серва действительно кран поворачивает.

Очень интересно, какой сервопривод Вы использовали? Сам задумываюсь над использованием сервы для шарового крана. Электроклапан на огороде хорош, а на ввод в дом его не поставишь вместо крана.

vvadim
Offline
Зарегистрирован: 23.05.2012

нафига на кран серву лепить , когда есть готовые девайсы...

да и на форуме об этом писалось

inspiritus
Offline
Зарегистрирован: 17.12.2012

Для ввода в дом есть готовыые приводы с шаровыми кранами 

http://www.stelmarket.ru/katalog/gidrolock_27.htm

 

stryzhak
Offline
Зарегистрирован: 28.05.2015

Спасибо за совет!

Но тема форума а том, как програму написать грамотноа, независимо от девайса! Но я понимаю реклама никогда не помишает!!!

Maxann
Offline
Зарегистрирован: 29.05.2015

inspiritus пишет:

Для ввода в дом есть готовыые приводы с шаровыми кранами 

http://www.stelmarket.ru/katalog/gidrolock_27.htm

 

Благодарю, но сей девайс покупайте сами. Я же на эту сумму куплю с десяток сервоприводов да еще и останется. 

Повторю свой вопрос топикстартеру: Какую модель сервопривода Вы использовали?

stryzhak
Offline
Зарегистрирован: 28.05.2015

MG996R Tower Pro, он идет с металическими шестеренками, и имеет модность 15кг на см.кв. У меня на дюймовой пластиковой трубе, стоят пластиковые краны, вот ссилка на фото в фейсбуке:

https://www.facebook.com/photo.php?fbid=936534403065151&set=pcb.93653462...

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

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

Потому все же решил купить клапаны, но дорогие правда...