#1 2015-05-28 11:37:15

stryzhak
Учасник
Зареєстрований: 2015-05-28
Повідомлень: 1

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

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

Неактивний

#2 2015-05-28 11:53:55

Pavel
Гість

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

При отправке команды на сервопривод сохраняйте текущее время из millis() в переменной. В основном цикле программы сравнивайте его со значением, большим на значение задержки, и, если, время с учетом задержки прошло - отключайте сервопривод.

#3 2015-05-28 12:16:45

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 875

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

возьмите за основу пример blink without delay

Неактивний

#4 2015-05-28 12:43:45

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

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

http://playground.arduino.cc/Code/Timer

для понимания процесса
http://www.atmel.com/images/doc2505.pdf

а что делает  .detach(); ? переводит ноги в третье состояние? .stop нет разве?
сам спросил и сам отвечу, нет  стопа нету )

Неактивний

#5 2015-05-28 21:34:04

cako79
Учасник
З Минск
Зареєстрований: 2015-05-10
Повідомлень: 10

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

почитайте вот здесь про многозадачность, мне помогло...http://robotosha.ru/arduino/multi-tasking-arduino.html

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

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