#1 Програмування Arduino » Нужна подсказка о том как прописать длительность исполнения функции » 2015-05-28 11:37:15

stryzhak
відповідей: 4

Здравствуйте друзья!
Создал свой первый проект для полива участка. Использую, кроме всего, две сервы. Так как, серва после поворота продолжает "гудеть", дабы серва не испортилась, решил использовать команду 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);
  }
}

Підвал форуму