Ви не увійшли.
Здравствуйте друзья!
Создал свой первый проект для полива участка. Использую, кроме всего, две сервы. Так как, серва после поворота продолжает "гудеть", дабы серва не испортилась, решил использовать команду 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);
}
}
Неактивний
При отправке команды на сервопривод сохраняйте текущее время из millis() в переменной. В основном цикле программы сравнивайте его со значением, большим на значение задержки, и, если, время с учетом задержки прошло - отключайте сервопривод.
http://playground.arduino.cc/Code/Timer
для понимания процесса
http://www.atmel.com/images/doc2505.pdf
а что делает .detach(); ? переводит ноги в третье состояние? .stop нет разве?
сам спросил и сам отвечу, нет стопа нету )
Неактивний