#1 2021-04-11 17:02:38

uamihanik
Учасник
Зареєстрований: 2021-04-11
Повідомлень: 5

Скетч для гроубокса под заказ

Нужно написать 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) с возможностью управления и просмотра показаний датчиков через браузер.

Некоторые функции скетча для отдельного датчика сам смог реализовать, но как их собрать в кучу - не понимаю и не смогу. Поэтому прошу помощи за деньги.

shema-Model-11500.jpg

Zakaz.zip

Неактивний

#2 2021-04-11 17:18:44

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

Re: Скетч для гроубокса под заказ

С вашим проектом день придется повозиться.
Вы работаете за 200 гр в день?

Неактивний

#3 2021-04-11 17:47:48

uamihanik
Учасник
Зареєстрований: 2021-04-11
Повідомлень: 5

Re: Скетч для гроубокса под заказ

Кто-то сможет написать такое за 1 час, выходит 200 грн не так уж и мало.
Разумный торг уместен.
UPD. Скетч нужен только под данное железо, без экрана, енкодера и т.п.

Остання редакція uamihanik (2021-04-11 17:54:18)

Неактивний

#4 2021-04-11 17:53:20

г0сть
Гість

Re: Скетч для гроубокса под заказ

200 грн. в час? Напишу за 10 дней, итого 24*10*200=48000 грн.

#5 2021-04-11 19:45:28

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 121

Re: Скетч для гроубокса под заказ

uamihanik пише:

Кто-то сможет написать такое за 1 час, выходит 200 грн не так уж и мало.

200 грн. за каждый пункт. Если согласны пишите на почту (жмите конвертик под ником).

Неактивний

#6 2021-04-11 19:50:42

uamihanik
Учасник
Зареєстрований: 2021-04-11
Повідомлень: 5

Re: Скетч для гроубокса под заказ

Тему можно закрывать, исполнителя нашёл.

Неактивний

#7 2021-04-12 20:23:26

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Скетч для гроубокса под заказ

uamihanik пише:

Тему можно закрывать, исполнителя нашёл.

Уж очень интересно посмотреть на результат ...   big_smile   Уже и час прошёл и день прошёл ...   lol

Остання редакція renoshnik (2021-04-12 20:26:24)

Неактивний

#8 2021-04-12 20:29:16

uamihanik
Учасник
Зареєстрований: 2021-04-11
Повідомлень: 5

Re: Скетч для гроубокса под заказ

Шо там смотреть, буковки, циферки, значочки какие-то, сало, як сало

Неактивний

#9 2021-04-12 20:31:22

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Скетч для гроубокса под заказ

uamihanik пише:

Шо там смотреть, буковки, циферки, значочки какие-то, сало, як сало

Понятно, всё как всегда в подобных случаях ...

Неактивний

#10 2021-04-12 21:11:46

MikeM
Учасник
З Киев
Зареєстрований: 2017-11-03
Повідомлень: 160

Re: Скетч для гроубокса под заказ

renoshnik пише:

всё как всегда в подобных случаях ...

Конечно, как всегда: одни выкладывают цену килограмма шоколадных конфет за аппаратно-программную разработку, а другие хотят на халяву увидеть результат.

Неактивний

#11 2021-04-12 21:21:18

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Скетч для гроубокса под заказ

MikeM пише:
renoshnik пише:

всё как всегда в подобных случаях ...

Конечно, как всегда: одни выкладывают цену килограмма шоколадных конфет за аппаратно-программную разработку, а другие хотят на халяву увидеть результат.

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

Неактивний

#12 2021-04-13 21:54:06

MikeM
Учасник
З Киев
Зареєстрований: 2017-11-03
Повідомлень: 160

Re: Скетч для гроубокса под заказ

Протест принимается.
Обещаю больше так не шутить.

Неактивний

#13 2021-05-03 21:10:49

г0сть
Гість

Re: Скетч для гроубокса под заказ

renoshnik пише:
uamihanik пише:

Тему можно закрывать, исполнителя нашёл.

Уж очень интересно посмотреть на результат ...   big_smile   Уже и час прошёл и день прошёл ...   lol

Если не ошибаюсь, вот он, результат 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;
}

#14 2021-05-03 23:13:23

uamihanik
Учасник
Зареєстрований: 2021-04-11
Повідомлень: 5

Re: Скетч для гроубокса под заказ

Подтверждаю.

Неактивний

#15 2021-05-04 11:21:40

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Скетч для гроубокса под заказ

г0сть пише:
renoshnik пише:
uamihanik пише:

Тему можно закрывать, исполнителя нашёл.

Уж очень интересно посмотреть на результат ...   big_smile   Уже и час прошёл и день прошёл ...   lol

Если не ошибаюсь, вот он, результат 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;
}

Ну такое ....   hmm

Неактивний

#16 2021-05-04 17:22:45

г0сть
Гість

Re: Скетч для гроубокса под заказ

renoshnik пише:

Ну такое ....   hmm

И шо вы хОчите за такие деньги?  За 200 грн да еще и за час накарябать нормальный код без делеев? Исполнитель похоже не дурак.

#17 2021-05-04 19:48:50

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Скетч для гроубокса под заказ

г0сть пише:
renoshnik пише:

Ну такое ....   hmm

И шо вы хОчите за такие деньги?  За 200 грн да еще и за час накарябать нормальный код без делеев? Исполнитель похоже не дурак.

Я даже до делеев не дошёл....

int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут
int s; // Переменная в которую записываются текущий показатель секунд

Понятно, что в этом задании нет смысла экономить память, но и разбазаривать её так совсем не красиво... И далее аналогичные "инты" глаз режут...

Неактивний

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

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

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