Ви не увійшли.
Сторінки 1
Нужно написать Arduino скетч для управления климатом в грубоксе.
Цена - 200 грн (торг уместен)
Имеется по железу:
Arduino Uno;
аналоговый датчик влажности почвы (аналоговый пин A1);
модуль часов в реальном времени DS1302 (цифровые пины 7, 8, 9);
датчик температуры и влажности DHT 21 (цифровой пин 6);
4-х канальный твердотельный релейный модуль G3MB-202P (цифровые пины 2, 3, 4, 5);
лампа;
кулер (вытяжка);
увлажнитель воздуха;
погружная помпа.
Требуемый алгоритм работы контроллера:
1. Реле 1 (Pin 5, лампа) – включается каждый день в 5:00, выключается в 23:00.
2. Реле 2 (Pin 4, кулер) – каждые 15 минут включается на 20 секунд.
3. Реле 2 (Pin 4, кулер), Реле 3 (Pin 3, увлажнитель)
- датчик температуры и влажности DHT 21 (Pin 6) каждые 5 минут делает 5 измерений с интервалом 2 секунды, высчитывает средние значения и, если среднее значение температуры выше 28 С включает Реле2 (Pin 4, кулер) на 30 секунд и, если среднее значение влажности меньше 30% включает Реле3 (Pin 3, увлажнитель) на 1 минуту.
4. Реле 4 (Pin2, помпа) - датчик влажности почвы каждые 2 часа делает 10 измерений с интервалом 3 секунды, высчитывает среднее значение и, если среднее значение влажности меньше 400 включает Реле4 (Pin 2, помпа) на 10 секунд.
В коде должны присутствовать комментарии строк, содержащие время включения, выключения лампы, предельные значения температуры и влажности, интервалы и длительность включения реле для возможности регулировки. Также выводить все показания в Serial port.
Если возьметесь за данную работу, посчитайте сколько будет стоить такой код для WeMos D1 MINI V3.0 (ESP8266) с возможностью управления и просмотра показаний датчиков через браузер.
Некоторые функции скетча для отдельного датчика сам смог реализовать, но как их собрать в кучу - не понимаю и не смогу. Поэтому прошу помощи за деньги.
Неактивний
Кто-то сможет написать такое за 1 час, выходит 200 грн не так уж и мало.
Разумный торг уместен.
UPD. Скетч нужен только под данное железо, без экрана, енкодера и т.п.
Остання редакція uamihanik (2021-04-11 17:54:18)
Неактивний
200 грн. в час? Напишу за 10 дней, итого 24*10*200=48000 грн.
Тему можно закрывать, исполнителя нашёл.
Уж очень интересно посмотреть на результат ... Уже и час прошёл и день прошёл ...
Остання редакція renoshnik (2021-04-12 20:26:24)
Неактивний
всё как всегда в подобных случаях ...
Конечно, как всегда: одни выкладывают цену килограмма шоколадных конфет за аппаратно-программную разработку, а другие хотят на халяву увидеть результат.
Неактивний
renoshnik пише:всё как всегда в подобных случаях ...
Конечно, как всегда: одни выкладывают цену килограмма шоколадных конфет за аппаратно-программную разработку, а другие хотят на халяву увидеть результат.
Уважаемый, по поводу халявы это абсолютно не по адресу...
Мой скепсис был исключительно о реальности качественного выполнения этого проекта за такие сроки и такой стимул...
Неактивний
uamihanik пише:Тему можно закрывать, исполнителя нашёл.
Уж очень интересно посмотреть на результат ... Уже и час прошёл и день прошёл ...
Если не ошибаюсь, вот он, результат https://esp8266.ru/forum/threads/kak-obedinit-dva-sketcha.5616/#post-80872
#include <DHT.h">
#include <DS1302.h>
#define DHTPin 2
#define DHTTYPE DHT21
int maxHum = 50; // предел влажность
int maxTemp = 27; // предел температура
float currentTemp = 25; // текущая температура, в процессе работы ее значение меняеться
float currentHum = 32;
DHT dht(DHTPIN, DHTTYPE);
Time t;
int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут
int s; // Переменная в которую записываются текущий показатель секунд
DS1302 rtc(5, 4, 0); /* Подключение the DS1302
CE pin (RES) -> Arduino Digital 7 -> wemos d1-5
I/O pin (DAT) -> Arduino Digital 8 -> wemos d2-4
SCLK pin(CLK) -> Arduino Digital 9 -> wemos d3-0
*/
uint32_t myTimer1;
int period = 99000; //
uint32_t myTimerVentil;
uint32_t myTimerPump;
uint32_t myTimerWater;
// пины для поключения
int lamp = 14;
int ventil = 12;
int water = 13;
int pump = 15;
int sensorPin = A0;
bool lampState = false;
int lastMin;
int last15Min;
int lastHour;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(ventil, OUTPUT);//вентилятор
pinMode(lamp, OUTPUT);//лампа
pinMode(water, OUTPUT);//увлажнитель воздуха
pinMode(pump, OUTPUT); //помпа
}
void loop() {
t = rtc.getTime();
d = t.hour, DEC;
m = t.min, DEC;
s = t.sec, DEC;
if (d >= 5 && d < 23) { //включаем лампу с 5 по 23
digitalWrite(lamp, HIGH);
if (!lampState) Serial.println("Лампа включена");
lampState = true;
}
// выключаем лампу в 23
else {
digitalWrite(lamp, LOW);
if (lampState) Serial.println("Лампа выключена");
lampState = false;
}
// здесь запускаем вытяжку каждые 15 минут
if (m % 15 == 0 && m != last15Min) {
Serial.print(rtc.getTimeStr());
last15Min = m;
digitalWrite(ventil, HIGH); // включаем кулер
Serial.println(" - Вытяжка запущена на 20 c.");
delay(20000); // время работы вытяжки
digitalWrite(ventil, LOW); // отключаем вытяжку
Serial.println("Вытяжка остановлена");
}
if (m % 2 == 0 && m != lastMin) { // выполняется через каждые 2 минуты, период менять ЗДЕСЬ
Serial.println("--");
Serial.println(rtc.getTimeStr());
lastMin = m;
myTimer1 += period; // сброс таймера
getValueDHT(5, 2); // запускаем функцию измерения влажности и температуры 5 измерений с интервалом 2 сек.
if (currentTemp > maxTemp && !digitalRead(ventil)) {
digitalWrite(ventil, HIGH); // включаем кулер
myTimerVentil = millis(); // фиксируем время включение кулера
Serial.println("Кулер запущен");
}
if (currentHum < maxHum && !digitalRead(water)) {
digitalWrite(water, HIGH); // включаем увлажнитель
myTimerWater = millis(); // фиксируем время включения увлажнителя
Serial.println("Включен увлажнитель");
}
}
if (d % 2 > 0 && m < 3 && s >= 35 && d != lastHour) { // выполняется каждую первую минуту нечетного часа т.е. раз в 2 часа
Serial.println(rtc.getTimeStr());
lastHour = d;
if (getValueSensor(10, 3) < 900) { // запускаем функцию измерения влажности почвы и полученое значение сравниваем с пределом. ПРЕДЕЛ ДЛЯ ПОМПЫ МЕНЯТЬ ЗДЕСЬ
digitalWrite(pump, HIGH); // включаем помпу
myTimerPump = millis(); // фиксируем время включения помпы
Serial.println("Помпа запущена");
}
}
if (millis() - myTimerVentil >= 30000) { // выключаем кулер через 30 с.
if (digitalRead(ventil)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Кулер остановлен");
}
digitalWrite(ventil, LOW);
}
if (millis() - myTimerWater >= 30000) { // выключаем увлажнитель через 30 с.
if (digitalRead(water)) {
Serial.print(rtc.getTimeStr());
Serial.println(" Увлажнитель отключен");
}
digitalWrite(water, LOW);
}
if (millis() - myTimerPump >= 10000) { // выключаем помпу через 10 с.
if (digitalRead(pump)) {
//Serial.print(rtc.getTimeStr());
//Serial.println(" Помпа остановлена");
}
digitalWrite(pump, LOW);
}
}
//функция определения влажности почвы
int getValueSensor(int quantity, int Interval) {
int sum = 0;
for (int i = 0; i < quantity; i++) {
sum += analogRead(sensorPin);
delay (Interval);
}
int result = sum / quantity;
Serial.print(result);
Serial.println(" - Влажность почвы");
return result;
}
//функция определения температуры и влажности
void getValueDHT(int quantity, int Interval) {
if (isnan(dht.readHumidity()) || isnan(dht.readTemperature())) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float h = 0;
float t = 0;
for (int i = 0; i < quantity; i++) {
h += dht.readHumidity();
t += dht.readTemperature();
delay (Interval);
}
h = h / quantity;
t = t / quantity;
currentTemp = t;
currentHum = h;
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
return;
}
renoshnik пише:uamihanik пише:Тему можно закрывать, исполнителя нашёл.
Уж очень интересно посмотреть на результат ... Уже и час прошёл и день прошёл ...
Если не ошибаюсь, вот он, результат https://esp8266.ru/forum/threads/kak-obedinit-dva-sketcha.5616/#post-80872
#include <DHT.h"> #include <DS1302.h> #define DHTPin 2 #define DHTTYPE DHT21 int maxHum = 50; // предел влажность int maxTemp = 27; // предел температура float currentTemp = 25; // текущая температура, в процессе работы ее значение меняеться float currentHum = 32; DHT dht(DHTPIN, DHTTYPE); Time t; int d; // Переменная в которую записываются текущий показатель часов int m; // Переменная в которую записываются текущий показатель минут int s; // Переменная в которую записываются текущий показатель секунд DS1302 rtc(5, 4, 0); /* Подключение the DS1302 CE pin (RES) -> Arduino Digital 7 -> wemos d1-5 I/O pin (DAT) -> Arduino Digital 8 -> wemos d2-4 SCLK pin(CLK) -> Arduino Digital 9 -> wemos d3-0 */ uint32_t myTimer1; int period = 99000; // uint32_t myTimerVentil; uint32_t myTimerPump; uint32_t myTimerWater; // пины для поключения int lamp = 14; int ventil = 12; int water = 13; int pump = 15; int sensorPin = A0; bool lampState = false; int lastMin; int last15Min; int lastHour; void setup() { Serial.begin(9600); dht.begin(); pinMode(ventil, OUTPUT);//вентилятор pinMode(lamp, OUTPUT);//лампа pinMode(water, OUTPUT);//увлажнитель воздуха pinMode(pump, OUTPUT); //помпа } void loop() { t = rtc.getTime(); d = t.hour, DEC; m = t.min, DEC; s = t.sec, DEC; if (d >= 5 && d < 23) { //включаем лампу с 5 по 23 digitalWrite(lamp, HIGH); if (!lampState) Serial.println("Лампа включена"); lampState = true; } // выключаем лампу в 23 else { digitalWrite(lamp, LOW); if (lampState) Serial.println("Лампа выключена"); lampState = false; } // здесь запускаем вытяжку каждые 15 минут if (m % 15 == 0 && m != last15Min) { Serial.print(rtc.getTimeStr()); last15Min = m; digitalWrite(ventil, HIGH); // включаем кулер Serial.println(" - Вытяжка запущена на 20 c."); delay(20000); // время работы вытяжки digitalWrite(ventil, LOW); // отключаем вытяжку Serial.println("Вытяжка остановлена"); } if (m % 2 == 0 && m != lastMin) { // выполняется через каждые 2 минуты, период менять ЗДЕСЬ Serial.println("--"); Serial.println(rtc.getTimeStr()); lastMin = m; myTimer1 += period; // сброс таймера getValueDHT(5, 2); // запускаем функцию измерения влажности и температуры 5 измерений с интервалом 2 сек. if (currentTemp > maxTemp && !digitalRead(ventil)) { digitalWrite(ventil, HIGH); // включаем кулер myTimerVentil = millis(); // фиксируем время включение кулера Serial.println("Кулер запущен"); } if (currentHum < maxHum && !digitalRead(water)) { digitalWrite(water, HIGH); // включаем увлажнитель myTimerWater = millis(); // фиксируем время включения увлажнителя Serial.println("Включен увлажнитель"); } } if (d % 2 > 0 && m < 3 && s >= 35 && d != lastHour) { // выполняется каждую первую минуту нечетного часа т.е. раз в 2 часа Serial.println(rtc.getTimeStr()); lastHour = d; if (getValueSensor(10, 3) < 900) { // запускаем функцию измерения влажности почвы и полученое значение сравниваем с пределом. ПРЕДЕЛ ДЛЯ ПОМПЫ МЕНЯТЬ ЗДЕСЬ digitalWrite(pump, HIGH); // включаем помпу myTimerPump = millis(); // фиксируем время включения помпы Serial.println("Помпа запущена"); } } if (millis() - myTimerVentil >= 30000) { // выключаем кулер через 30 с. if (digitalRead(ventil)) { Serial.print(rtc.getTimeStr()); Serial.println(" Кулер остановлен"); } digitalWrite(ventil, LOW); } if (millis() - myTimerWater >= 30000) { // выключаем увлажнитель через 30 с. if (digitalRead(water)) { Serial.print(rtc.getTimeStr()); Serial.println(" Увлажнитель отключен"); } digitalWrite(water, LOW); } if (millis() - myTimerPump >= 10000) { // выключаем помпу через 10 с. if (digitalRead(pump)) { //Serial.print(rtc.getTimeStr()); //Serial.println(" Помпа остановлена"); } digitalWrite(pump, LOW); } } //функция определения влажности почвы int getValueSensor(int quantity, int Interval) { int sum = 0; for (int i = 0; i < quantity; i++) { sum += analogRead(sensorPin); delay (Interval); } int result = sum / quantity; Serial.print(result); Serial.println(" - Влажность почвы"); return result; } //функция определения температуры и влажности void getValueDHT(int quantity, int Interval) { if (isnan(dht.readHumidity()) || isnan(dht.readTemperature())) { Serial.println("Failed to read from DHT sensor!"); return; } float h = 0; float t = 0; for (int i = 0; i < quantity; i++) { h += dht.readHumidity(); t += dht.readTemperature(); delay (Interval); } h = h / quantity; t = t / quantity; currentTemp = t; currentHum = h; Serial.print("Humidity: "); Serial.print(h); Serial.print(" %t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C "); return; }
Ну такое ....
Неактивний
Ну такое ....
И шо вы хОчите за такие деньги? За 200 грн да еще и за час накарябать нормальный код без делеев? Исполнитель похоже не дурак.
renoshnik пише:Ну такое ....
И шо вы хОчите за такие деньги? За 200 грн да еще и за час накарябать нормальный код без делеев? Исполнитель похоже не дурак.
Я даже до делеев не дошёл....
int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут
int s; // Переменная в которую записываются текущий показатель секунд
Понятно, что в этом задании нет смысла экономить память, но и разбазаривать её так совсем не красиво... И далее аналогичные "инты" глаз режут...
Неактивний
Сторінки 1