Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
1

Автоматический полив

09.02.2017, 11:14. Просмотров 3222. Ответов 23
Метки нет (Все метки)

Добрый всем!
Тема по созданию автомотического полива.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2017, 11:14
Ответы с готовыми решениями:

Автоматический полив через USB
Никогда не сталкивался, но вот появилось свободное время и решил я сделать у себя в саду...

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

Автоматический выключатель
доброе время суток! Помогите в детском вопросе, нашёл автомат, ссылка(...

Автоматический монтаж
Добрый день! Никак не могу найти (нагуглить), как именно готовить документацию под...

23
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
09.02.2017, 11:17  [ТС] 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// Автополив огорода v.3.0
 
#include <Wire.h>;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);
#include <TimerOne.h>
#include <StepDirDriver.h>
StepDirDriver myMotor(10, 11, 12);
#include "DHT.h"
#define DHTPIN 2 // к какому пину будет подключен сигнальный выход датчика
//выбор используемого датчика
#define DHTTYPE DHT11 // DHT 11
//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);
byte degree[8] = // кодируем символ градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};
 
//Проветривание
 
 
unsigned int timeCounter; // счетчик времени
byte md;  // режим: 0 - вращение против ч.с., 1 - пауза, 2 - вращение против ч.с., 3 - пауза
 
// Сенсоры анализ влажности почвы
int sensorPin =0;
int sensorValue =0;
int sensor1Pin =1;
int sensor1Value =1;
int sensor2Pin =2;
int sensor2Value =2;
int sensor3Pin =3;
int sensor3Value =3;
int sensor4Pin =4;
int sensor4Value =4;
int sensor5Pin =5;
int sensor5Value =5;
 
 
// Выходные реле включения клапаннов полива
int relePin =13;
int rele1Pin =12;
 
 
  
void setup() {
Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
myMotor.setDivider(3);     // делитель частоты 10 (1 оборот в сек)
md= 0;  // начальный режим
myMotor.step(0);  // начальный запуск
 
// вывод на экран:
Serial.begin(9600);
dht.begin();
pinMode(relePin, OUTPUT);
pinMode(rele1Pin, OUTPUT);
// Отображение на экране
lcd.begin();
lcd.print("Avtopoliv v 3.0 KUK");
lcd.setCursor(20,1);
 
//мотор
 
            
}
 
void loop() {
  // дотчик влажности и температуры
delay(1000);
 
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
// Выводим показания влажности и температуры
 
 
lcd.setCursor(0, 1);
lcd.print("D1 = %");
lcd.setCursor(3, 1);
lcd.print (analogRead(0) / 10);
lcd.setCursor(7, 1);
lcd.print("D2 = %");
lcd.setCursor(10, 1);
lcd.print (analogRead(1) / 10);
lcd.setCursor(14, 1);
lcd.print("D3 = %");
lcd.setCursor(17, 1);
lcd.print (analogRead(2) / 10);
lcd.setCursor(0, 2);
lcd.print("D4 = %");
lcd.setCursor(3, 2);
lcd.print (analogRead(3)/ 10);
lcd.setCursor(7, 2);
lcd.print("D5 = %");
lcd.setCursor(10, 2);
lcd.print (analogRead(4)/ 10);
lcd.setCursor(14, 2);
lcd.print("D6 = %");
lcd.setCursor(17, 2);
lcd.print (analogRead(5) / 10);
lcd.setCursor(12, 3); // Устанавливаем курсор в начало 4 строку
lcd.print("Vl =   %"); // Выводим текст
lcd.setCursor(15, 3); // Устанавливаем курсор на 15 символ
lcd.print(h, 1); // Выводим на экран значение влажности
lcd.createChar(1, degree);
lcd.setCursor(0, 3); 
lcd.print("Temp =   \1C"); // Выводим текст, \1 - значок градуса
lcd.setCursor(5, 3); // Устанавливаем курсор на 7 символ
lcd.print(t,1); // Выводим значение температуры
 
 
 
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
delay(100);
sensor1Value = analogRead(sensor1Pin);
Serial.println(sensor1Value);
delay(100);
sensor2Value = analogRead(sensor2Pin);
Serial.println(sensor2Value);
delay(100);
sensor3Value = analogRead(sensor3Pin);
Serial.println(sensor3Value);
delay(100);
sensor4Value = analogRead(sensor4Pin);
Serial.println(sensor4Value);
delay(100);
sensor5Value = analogRead(sensor5Pin);
Serial.println(sensor5Value);
delay(100);
//Считываем влажность
 
 
  if (analogRead(0) <= 470) // Датчик №1 Если очень влажная почва, отключение полива
    digitalWrite(13, HIGH);
  delay(100); //Обновление значения каждые 10 секунд
  if (analogRead(0) >= 800) // Если почва сухая, включение полива
    digitalWrite(13, LOW);
  delay(100); //Обновление значения каждые 10 секунд
  if (analogRead(1) <= 470) // Датчик №2 Если очень влажная почва, отключение полива
    digitalWrite(12, HIGH);
  delay(100); //Обновление значения каждые 10 секунд
  if (analogRead(1) >= 800) // Если почва сухая, включение полива
    digitalWrite(12, LOW);
  delay(100); //Обновление значения каждые 10 секунд
  if (analogRead(2) <= 470) // Датчик №3 Если очень влажная почва, отключение полива
    digitalWrite(11, HIGH);
  delay(100); //Обновление значения каждые 10 секунд
  if (analogRead(2) >= 800) // Если почва сухая, включение полива
    digitalWrite(11, LOW);
  delay(100); //Обновление значения каждые 10 секунд
  if (analogRead(3) <= 470) // Датчик №4 Если очень влажная почва, отключение полива
    digitalWrite(10, HIGH);
  delay(100); //Обновление значения каждые 10 секунд
  if (analogRead(3) >= 800) // Если почва сухая, включение полива
    digitalWrite(10, LOW);
  delay(100); //Обновление значения каждые 10 секунд
 
  //мотор
  // управление вращением двигателя
 
  if (md == 0)  {
    // 2 оборота по часовой стрелке
    if (myMotor.readSteps() == 0) { md=1; timeCounter=0; }
  }
  else if (md == 1) {
    // пауза 1 сек
    if (timeCounter >= 1000)  { md=2; myMotor.step(-800); }
  }
  else if (md == 2) {
    // 2 оборота против часовой стрелки
    if (myMotor.readSteps() == 0) { md=3; timeCounter=0; }    
  }
  else {
   // пауза 1 сек
   if (timeCounter >= 1000)  { md=0; myMotor.step(800); }    
  }
  
}
 
//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  timeCounter++; // счетчик времени
  
 
}
0
Вложения
Тип файла: zip AV3.0.zip (2.0 Кб, 23 просмотров)
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
09.02.2017, 11:21  [ТС] 3
Не могу доработать систему открывания закрывания дверей на проветривания с помощью шагового двигателя
при определенной температуре.
Есть кто поможет доработать данный файл?
Всем спасибо!
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
09.02.2017, 12:32 4
Ничего не понял.
Что есть sensorPin и sensorValue?
В определении переменных моторы на 10,11,12 пинах. В void setup() реле на 12 и 13 пине. 12й пин и мотор и реле. В void loop() прямое обращение к 13,12,11,10 пинам.
Совершенно не понятно, зачем столько delay(100);
«delay(100); //Обновление значения каждые 10 секунд» Вообще то delay(100); это 0,1 секунды.
0
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
10.02.2017, 21:12  [ТС] 5
Ну по скольку я новичок в этом деле, у меня так получилось, возможно сделать прерывании одно на все функции?

Добавлено через 2 минуты
sensorPin и sensorValue это сенсоры измерения влажности подключенные к контактам на ардуино. каждый сенсор это отдельный полив отдельного участка.

Добавлено через 12 часов 30 минут
Если у кого то есть мысли по доработке, буду рад любой помощи.
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
16.02.2017, 14:08 6
Строку 30 меняем на
C++
1
int door=0; //если дверь закрыта door=0, если открыта door=1
Строку 58 удаляем
Строки 179 – 188 меняем на
C++
1
2
3
4
5
6
7
8
9
10
//мотор
// управление вращением двигателя
if (door == 0 && t>25 ) { //если дверь закрыта и температура больше 25
myMotor.step(800); //крутим мотор по часовой
door=1; // «открываем» дверь
 }
if (door == 1 && t<20 ) { //если дверь открыта и температура меньше 20
myMotor.step(-800); //крутим мотор против часовой
door=0; // «закрываем» дверь
 }
0
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
16.02.2017, 20:45  [ТС] 7
Сегодня все изменения внес.
Проверил, все работает!
Спасибо огромное!
протестирую в теплице, отпишусь
0
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
22.02.2017, 21:06  [ТС] 8
Добрый день Всем!

Сергей 190, хочу спросить Вас!
Можно ли как то изменять скорость вращения мотора?
И когда устанавливаю больше 8000 и более шагов, мотор крутиться так же как будто стоит 7000.
Что то можно сделать?

Спасибо огромное!
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
23.02.2017, 12:34 9
Не очень удачный выбор использовать библиотеку Stepper. Функциональные возможности ограничены, пока работает двигатель все остальное «подвешено». Да и неоправданно сложно.
Какой у Вас контроллер ШД?
0
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
23.02.2017, 16:00  [ТС] 10
Добрый день!
С праздником 23!

Контроллер TB6560.
Что можно предпринять?

Спасибо!
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
24.02.2017, 19:41 11
Подключаем 10 пин ардуины к «CLK+» драйвера, 11 к « CW+».
Задаем произвольное значение int Pause= 500; (строка 2)
Если двигатель работает и отрабатывает необходимое количество шагов (Distance= 8000), уменьшаем значение (Pause= 500). Если не крутится или дергается (начинаются пропуски шагов) – увеличиваем. Если значение Pause достигает несколько тысяч микросекунд строки 25 и 27 меняем на
C++
1
delay(Pause);
Ищем минимальное значение. Запоминаем. Это будет максимальная скорость для данного двигателя при заданной настройке драйвера (шаг, полушаг, микро шаг) и при конкретном блоке питания (напряжение, ток).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int Distance= 8000; //  Необходимое количество шагов
int Pause= 500;  // Чем меньше значение, тем быстрее крутится
int Step=10; // CLK+
int Direction=11; // CW+
 
void setup() {
pinMode(Direction, OUTPUT); 
pinMode(Step, OUTPUT); 
digitalWrite(Direction, LOW);
digitalWrite(Step, LOW);
}
 
void loop() {
rotation(); //Крутим на "Distance" шагов
delay(2000);
digitalWrite(Direction, HIGH); // Включаем направление в другую сторону
rotation(); //Крутим на "Distance" шагов
digitalWrite(Direction, LOW); // вЫключаем направление в "другую сторону"
delay(2000);
}
 
void rotation(){
for (int i=1; i<=Distance; i++){ 
digitalWrite(Step, HIGH);
delayMicroseconds(Pause);
digitalWrite(Step, LOW);
delayMicroseconds(Pause);  
}
}
0
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
24.02.2017, 20:52  [ТС] 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
// Автополив огорода v.3.2
 
#include <Wire.h>;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);
#include <TimerOne.h>
#include <StepDirDriver.h>
StepDirDriver myMotor(3, 4, 5); //Выводы контактов шагового двигателя
int Distance= 8000; //  Необходимое количество шагов
int Pause= 500;  // Чем меньше значение, тем быстрее крутится
int Step=10; // CLK+
int Direction=11; // CW+
#include "DHT.h" // Библиотека датчика температуры и влажности
#define DHTPIN 2 // К какому пину будет подключен сигнальный выход датчика
#define DHTTYPE DHT11 // DHT 11 выбор используемого датчика
DHT dht(DHTPIN, DHTTYPE); //инициализация датчика
byte degree[8] = // кодируем символ градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};
 
//Проветривание
unsigned int timeCounter; // счетчик времени
int door=0; //если дверь закрыта door=0, если открыта door=1
// Сенсоры анализ влажности почвы
int sensorPin =0;
int sensorValue =0;
int sensor1Pin =1;
int sensor1Value =1;
int sensor2Pin =2;
int sensor2Value =2;
int sensor3Pin =3;
int sensor3Value =3;
int sensor4Pin =4;
int sensor4Value =4;
int sensor5Pin =5;
int sensor5Value =5;
//датчик влажности на мотор
int dhtPin (2);
int dhtValue (2);
// Выходные реле включения клапаннов полива
int relePin =13;
int rele1Pin =12;
  
void setup() {
  
Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
//Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
//myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
myMotor.setDivider(3);     // делитель частоты 10 (1 оборот в сек)
myMotor.step(0);  // начальный запуск
pinMode(Direction, OUTPUT); 
pinMode(Step, OUTPUT); 
digitalWrite(Direction, LOW);
digitalWrite(Step, LOW);
 
// вывод на экран:
Serial.begin(9600);
dht.begin();
pinMode(relePin, OUTPUT);
pinMode(rele1Pin, OUTPUT);
// Отображение на экране
lcd.begin();
lcd.print("Avtopoliv v 3.0 KUK");
lcd.setCursor(20,1);
       
}
 
void loop() {
   
  // дотчик влажности и температуры
delay(1000);
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
 
 
// Выводим показания влажности и температуры на экран по сторокам
lcd.setCursor(0, 1);
lcd.print("D1 = %");
lcd.setCursor(3, 1);
lcd.print (analogRead(0) / 10);
lcd.setCursor(7, 1);
lcd.print("D2 = %");
lcd.setCursor(10, 1);
lcd.print (analogRead(1) / 10);
lcd.setCursor(14, 1);
lcd.print("D3 = %");
lcd.setCursor(17, 1);
lcd.print (analogRead(2) / 10);
lcd.setCursor(0, 2);
lcd.print("D4 = %");
lcd.setCursor(3, 2);
lcd.print (analogRead(3)/ 10);
lcd.setCursor(7, 2);
lcd.print("D5 = %");
lcd.setCursor(10, 2);
lcd.print (analogRead(4)/ 10);
lcd.setCursor(14, 2);
lcd.print("D6 = %");
lcd.setCursor(17, 2);
lcd.print (analogRead(5) / 10);
lcd.setCursor(12, 3); // Устанавливаем курсор в начало 4 строку
lcd.print("Vl =   %"); // Выводим текст
lcd.setCursor(15, 3); // Устанавливаем курсор на 15 символ
lcd.print(h, 1); // Выводим на экран значение влажности
lcd.createChar(1, degree);
lcd.setCursor(0, 3); 
lcd.print("Temp =   \1C"); // Выводим текст, \1 - значок градуса
lcd.setCursor(5, 3); // Устанавливаем курсор на 7 символ
lcd.print(t,1); // Выводим значение температуры
 
 
//Указываем датчики
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
sensor1Value = analogRead(sensor1Pin);
Serial.println(sensor1Value);
sensor2Value = analogRead(sensor2Pin);
Serial.println(sensor2Value);
sensor3Value = analogRead(sensor3Pin);
Serial.println(sensor3Value);
sensor4Value = analogRead(sensor4Pin);
Serial.println(sensor4Value);
sensor5Value = analogRead(sensor5Pin);
Serial.println(sensor5Value);
delay(1000);
//Считываем влажность
if (analogRead(0) <= 470) // Датчик №1 Если очень влажная почва, отключение полива
digitalWrite(13, HIGH);
if (analogRead(0) >= 800) // Если почва сухая, включение полива
digitalWrite(13, LOW);
if (analogRead(1) <= 470) // Датчик №2 Если очень влажная почва, отключение полива
digitalWrite(12, HIGH);
if (analogRead(1) >= 800) // Если почва сухая, включение полива
digitalWrite(12, LOW);
if (analogRead(2) <= 470) // Датчик №3 Если очень влажная почва, отключение полива
digitalWrite(11, HIGH);
if (analogRead(2) >= 800) // Если почва сухая, включение полива
digitalWrite(11, LOW);
if (analogRead(3) <= 470) // Датчик №4 Если очень влажная почва, отключение полива
digitalWrite(10, HIGH);
if (analogRead(3) >= 800) // Если почва сухая, включение полива
digitalWrite(10, LOW);
if (analogRead(3) <= 470) // Датчик №5 Если очень влажная почва, отключение полива
digitalWrite(9, HIGH);
if (analogRead(3) >= 800) // Если почва сухая, включение полива
digitalWrite(9, LOW);
if (analogRead(3) <= 470) // Датчик №6 Если очень влажная почва, отключение полива
digitalWrite(8, HIGH);
if (analogRead(3) >= 800) // Если почва сухая, включение полива
digitalWrite(8, LOW);
delay(1000); //Обновление значения каждые 1 секунду
 
// Мотор, управление вращением двигателя
 
rotation(); //Крутим на "Distance" шагов
delay(2000);
digitalWrite(Direction, HIGH); // Включаем направление в другую сторону
rotation(); //Крутим на "Distance" шагов
digitalWrite(Direction, LOW); // вЫключаем направление в "другую сторону"
delay(2000);
 
if (door == 0 && t>27 ) { //если дверь закрыта и температура больше 25
myMotor.step(1000); //крутим мотор по часовой
door=1; // «открываем» дверь
 }
if (door == 1 && t<26 ) { //если дверь открыта и температура меньше 20
myMotor.step(-1000); //крутим мотор против часовой
door=0; // «закрываем» дверь
}
}
 
 
void rotation(){
for (int i=1; i<=Distance; i++){ 
digitalWrite(Step, HIGH);
delayMicroseconds(Pause);
digitalWrite(Step, LOW);
delayMicroseconds(Pause); 
}
//-------------------------------------- обработчик прерывания 0,25 мс
//void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  timeCounter++; // счетчик времени
  
 
}
 
[size="1"][color="grey"][I]Добавлено через 1 минуту[/I][/color][/size]
А при изменениях температуры, как будет работать на закрытие двери или открытия?
Я так понимаю старые значения надо удалить строки 
if (door == 0 && t>27 ) { //если дверь закрыта и температура больше 25
myMotor.step(1000); //крутим мотор по часовой
door=1; // «открываем» дверь
}
if (door == 1 && t<26 ) { //если дверь открыта и температура меньше 20
myMotor.step(-1000); //крутим мотор против часовой
door=0; // «закрываем» дверь
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
24.02.2017, 22:31 13
Karkav33, почитайте повнимательнее Правила форума и как пользоваться тегами. Хрен поймешь, где начало и конец кода, а где вопросы. Надеюсь модераторы поправят, но в следующий раз Вы получите предупреждение.
Мой код с двигателем заработал?
0
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
26.02.2017, 09:47  [ТС] 14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
// Автополив огорода v.3.2
 
#include <Wire.h>;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);
#include <TimerOne.h>
#include <StepDirDriver.h>
StepDirDriver myMotor(3, 4, 5); //Выводы контактов шагового двигателя
int Distance= 8000; //  Необходимое количество шагов
int Pause= 500;  // Чем меньше значение, тем быстрее крутится
int Step=9; // CLK+
int Direction=8; // CW+
#include "DHT.h" // Библиотека датчика температуры и влажности
#define DHTPIN 2 // К какому пину будет подключен сигнальный выход датчика
#define DHTTYPE DHT11 // DHT 11 выбор используемого датчика
DHT dht(DHTPIN, DHTTYPE); //инициализация датчика
byte degree[8] = // кодируем символ градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};
 
//Проветривание
unsigned int timeCounter; // счетчик времени
int door=0; //если дверь закрыта door=0, если открыта door=1
// Сенсоры анализ влажности почвы
int sensorPin =0;
int sensorValue =0;
int sensor1Pin =1;
int sensor1Value =1;
int sensor2Pin =2;
int sensor2Value =2;
int sensor3Pin =3;
int sensor3Value =3;
int sensor4Pin =4;
int sensor4Value =4;
int sensor5Pin =5;
int sensor5Value =5;
//датчик влажности на мотор
int dhtPin (2);
int dhtValue (2);
// Выходные реле включения клапаннов полива
int relePin =13;
int rele1Pin =12;
  
void setup() {
  
Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
//Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
//myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
myMotor.setDivider(3);     // делитель частоты 10 (1 оборот в сек)
myMotor.step(0);  // начальный запуск
pinMode(Direction, OUTPUT); 
pinMode(Step, OUTPUT); 
digitalWrite(Direction, LOW);
digitalWrite(Step, LOW);
 
// вывод на экран:
Serial.begin(9600);
dht.begin();
pinMode(relePin, OUTPUT);
pinMode(rele1Pin, OUTPUT);
// Отображение на экране
lcd.begin();
lcd.print("Avtopoliv v 3.0 KUK");
lcd.setCursor(20,1);
       
}
 
void loop() {
   
  // дотчик влажности и температуры
delay(1000);
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
 
 
// Выводим показания влажности и температуры на экран по сторокам
lcd.setCursor(0, 1);
lcd.print("D1 = %");
lcd.setCursor(3, 1);
lcd.print (analogRead(0) / 10);
lcd.setCursor(7, 1);
lcd.print("D2 = %");
lcd.setCursor(10, 1);
lcd.print (analogRead(1) / 10);
lcd.setCursor(14, 1);
lcd.print("D3 = %");
lcd.setCursor(17, 1);
lcd.print (analogRead(2) / 10);
lcd.setCursor(0, 2);
lcd.print("D4 = %");
lcd.setCursor(3, 2);
lcd.print (analogRead(3)/ 10);
lcd.setCursor(7, 2);
lcd.print("D5 = %");
lcd.setCursor(10, 2);
lcd.print (analogRead(4)/ 10);
lcd.setCursor(14, 2);
lcd.print("D6 = %");
lcd.setCursor(17, 2);
lcd.print (analogRead(5) / 10);
lcd.setCursor(12, 3); // Устанавливаем курсор в начало 4 строку
lcd.print("Vl =   %"); // Выводим текст
lcd.setCursor(15, 3); // Устанавливаем курсор на 15 символ
lcd.print(h, 1); // Выводим на экран значение влажности
lcd.createChar(1, degree);
lcd.setCursor(0, 3); 
lcd.print("Temp =   \1C"); // Выводим текст, \1 - значок градуса
lcd.setCursor(5, 3); // Устанавливаем курсор на 7 символ
lcd.print(t,1); // Выводим значение температуры
 
 
//Указываем датчики
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
sensor1Value = analogRead(sensor1Pin);
Serial.println(sensor1Value);
sensor2Value = analogRead(sensor2Pin);
Serial.println(sensor2Value);
sensor3Value = analogRead(sensor3Pin);
Serial.println(sensor3Value);
sensor4Value = analogRead(sensor4Pin);
Serial.println(sensor4Value);
sensor5Value = analogRead(sensor5Pin);
Serial.println(sensor5Value);
delay(1000);
//Считываем влажность
if (analogRead(0) <= 470) // Датчик №1 Если очень влажная почва, отключение полива
digitalWrite(13, HIGH);
if (analogRead(0) >= 800) // Если почва сухая, включение полива
digitalWrite(13, LOW);
if (analogRead(1) <= 470) // Датчик №2 Если очень влажная почва, отключение полива
digitalWrite(12, HIGH);
if (analogRead(1) >= 800) // Если почва сухая, включение полива
digitalWrite(12, LOW);
if (analogRead(2) <= 470) // Датчик №3 Если очень влажная почва, отключение полива
digitalWrite(11, HIGH);
if (analogRead(2) >= 800) // Если почва сухая, включение полива
digitalWrite(11, LOW);
if (analogRead(3) <= 470) // Датчик №4 Если очень влажная почва, отключение полива
digitalWrite(10, HIGH);
if (analogRead(3) >= 800) // Если почва сухая, включение полива
digitalWrite(10, LOW);
if (analogRead(3) <= 470) // Датчик №5 Если очень влажная почва, отключение полива
digitalWrite(9, HIGH);
if (analogRead(3) >= 800) // Если почва сухая, включение полива
digitalWrite(9, LOW);
if (analogRead(3) <= 470) // Датчик №6 Если очень влажная почва, отключение полива
digitalWrite(8, HIGH);
if (analogRead(3) >= 800) // Если почва сухая, включение полива
digitalWrite(8, LOW);
delay(1000); //Обновление значения каждые 1 секунду
 
// Мотор, управление вращением двигателя
 
rotation(); //Крутим на "Distance" шагов
delay(2000);
digitalWrite(Direction, HIGH); // Включаем направление в другую сторону
rotation(); //Крутим на "Distance" шагов
digitalWrite(Direction, LOW); // вЫключаем направление в "другую сторону"
delay(2000);
 
if (door == 0 && t>27 ) { //если дверь закрыта и температура больше 25
myMotor.step(1000); //крутим мотор по часовой
door=1; // «открываем» дверь
 }
if (door == 1 && t<26 ) { //если дверь открыта и температура меньше 20
myMotor.step(-1000); //крутим мотор против часовой
door=0; // «закрываем» дверь
}
}
 
 
void rotation(){
for (int i=1; i<=Distance; i++){ 
digitalWrite(Step, HIGH);
delayMicroseconds(Pause);
digitalWrite(Step, LOW);
delayMicroseconds(Pause); 
}
//-------------------------------------- обработчик прерывания 0,25 мс
//void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  timeCounter++; // счетчик времени
  
 
}

Добавлено через 2 минуты
Добрый день!
Не могу понять почему номера строк не проставляются, в ардуино в правке копирую для форума. Вроде как обычно.
Прошу прощения если что не так!

Добавлено через 3 минуты
Я прописал что Вы написали ранее, двигатель работает в одну сторону с паузой в 2 секунды и без разницы какая
температура с датчика. Просто крутится в одну сторону.
0
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
26.02.2017, 10:11  [ТС] 15
C++
1
2
3
4
5
6
7
8
// Мотор, управление вращением двигателя
 
rotation(); //Крутим на "Distance" шагов
delay(2000);
digitalWrite(Direction, LOW); // Включаем направление в другую сторону
rotation(); //Крутим на "Distance" шагов
digitalWrite(Direction, HIGH); // вЫключаем направление в "другую сторону"
delay(2000);
Поменял значения в строке 167 на LOW, а в строке 169 на HIGH.
Двигатель крутится в одну сторону, потом в другую на одинаковые количества оборотов.
Как изменить количество оборотов в ту или другую сторону?
Как приписать температуру, что бы при 28 градусах открывалась дверь, а при 24 закрывалась?

Спасибо огромное что помогаете!
0
Вложения
Тип файла: rar AV3.2.rar (2.2 Кб, 11 просмотров)
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
26.02.2017, 10:55  [ТС] 16
С оборотами разобрался!
Вот количество шагов максимум 24000 ставлю значение в int Distance= 24000; // Необходимое количество шагов
если ставлю больше мотор просто молчит, а при 24000 дверь открывается на 20 сантиметров
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
26.02.2017, 11:36 17
Цитата Сообщение от Karkav33 Посмотреть сообщение
если ставлю больше мотор просто молчит
Странно. int хранит числа от -32 768 до 32 767

Напишите long Distance= ... ;
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
26.02.2017, 11:48 18
Цитата Сообщение от Karkav33 Посмотреть сообщение
Не могу понять почему номера строк не проставляются
Заветная кнопочка для ардуиновского кода слева
0
Миниатюры
Автоматический полив  
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 14
26.02.2017, 13:10  [ТС] 19
поставил значение long Distance= 33000; // Необходимое количество шагов
двигатель крутится в одну сторону постоянно не останавливается вообще
0
342 / 329 / 69
Регистрация: 18.03.2015
Сообщений: 1,161
26.02.2017, 13:43 20
magirus поставил теги - стало понятнее.
Я Вам предложил свой вариант кода, чтобы избавиться от Stepper.
Строки 163 – 179 меняем на
C++
1
2
3
4
5
6
7
8
9
10
11
// Мотор, открываем/закрываем дверь
if (door == 0 && t>28 ) { //если дверь закрыта и температура больше 25
rotation(); //Крутим на "Distance" шагов
door=1; // «открываем» дверь
 }
if (door == 1 && t<24 ) { //если дверь открыта и температура меньше 20
digitalWrite(Direction, HIGH); // Включаем направление в другую сторону
rotation(); //Крутим на "Distance" шагов
digitalWrite(Direction, LOW); // вЫключаем направление в "другую сторону"
door=0; // «закрываем» дверь
}
Строки 7, 8, 29, 53 – 57, 190 – 196 удаляем.

Цитата Сообщение от Karkav33 Посмотреть сообщение
при 24000 дверь открывается на 20 сантиметров
В режиме шага, для большинства шаговых двигателей, требуется 200 шагов для одного оборота.
Если Ваш контроллер настроен на полушаг/микрошаг, то зачем Вам это? Дверь в парнике позиционируется с точностью в доли миллиметра?
Или редуктор для двери слишком мощный?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2017, 13:43

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

Автоматический выключатель
Есть задумка сделать примитивную систему энергосбережения. Принцип таков: есть кто-то в помещении -...

Автоматический стриппер – есть вопрос
Прикупил тут вот такой стриппер: ...

Автоматический регулятор оборотов минидрели
вчерась случайно наткнулся на вот эту статью а конкретно на схему Илександъра Савова. выглядит...

Автоматический полив. Хочется датчиков, с чего начать?
Вот решил сделать автоматический полив. К примеру сам полив я организую, а вот с датчиками проблема...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.