С какой стороны нерационально?
1. дешевле
2. меньше
3. полезней для мозга
Если есть цель самому программировать и делать. А так конечно ардуино наше фсё.
не, ну можно конечно и сопромат выучить чтобы из проволки скрепку скрутить, а можно за 5 сек взять и просто скрутить скрепку не выпендриваясь вы часом не программист?
набросок кода контролирующего автодолив, в перспективе рН, контроль температуры, влажности, вентилятора
#include <SPI.h>
#include <Wire.h>
//#include "DHT.h"
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include "Sodaq_DS3231.h"
#include <Bounce2.h>
#define OLED_RESET 4
#define DHTPIN 2
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(OLED_RESET);
//DateTime dt(2017, 22, 06, 16, 9, 00, 3);
int pin_WLS1 = 3;
int pin_WLS2 = 2;
int pin_WLS_tank = 7;
int pin_RelayON = 8;
String timedate;
String timedateLast;
Bounce WLS1 = Bounce();
Bounce WLS2 = Bounce();
Bounce WLS_tank = Bounce();
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//dht.begin();
Wire.begin();
rtc.begin();
pinMode(pin_WLS1, INPUT_PULLUP);
WLS1.attach(pin_WLS1); //2
WLS1.interval(5);
pinMode(pin_WLS2, INPUT_PULLUP);
WLS2.attach(pin_WLS2); //3
WLS2.interval(5);
pinMode(pin_WLS_tank, INPUT_PULLUP);
WLS_tank.attach(pin_WLS_tank); //4
WLS_tank.interval(5);
pinMode(pin_RelayON, OUTPUT); //6
digitalWrite(pin_RelayON, LOW);
display.setTextSize(1);
SendToScreen(0, 0, "Diagnostic...", 0, 1);
digitalWrite(pin_RelayON, LOW);
//tone(10, 2000, 1000);
}
String printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
String valtm;
if(digits < 10)
{
valtm = "0" + String(digits);
return valtm;
}
valtm = String(digits);
return valtm;
}
void SendToScreen (int x, int y, String text, int colour, int clear1) //SendToScreen(0, 16, "To open click RST", 0, 0);
{
display.clearDisplay();
if (colour == 0) display.setTextColor(BLACK);
else
{
display.setTextColor(WHITE);
Serial.println( text);
}
display.setCursor(x, y);
display.print(text);
display.display();
}
int ooo = 0, nnn = 0;
void loop()
{
DateTime now = rtc.now(); //get the current date-time
timedate = printDigits(now.date()) + String(".") + printDigits(now.month()) + String(".") + printDigits(now.year()).substring(2, printDigits(now.year()).length()) + String(" ") +
printDigits(now.hour()) + String(":") + printDigits(now.minute()) + String(":") + printDigits(now.second());
if (timedate.compareTo(timedateLast) != 0)
{
//Serial.println(timedateLast);
SendToScreen(0, 25, timedateLast, 0, 0);
SendToScreen(0, 25, timedate, 1, 0);
timedateLast = timedate;
/*nnn = digitalRead(waterPin);
SendToScreen(100, 0, ooo, 0, 0);
SendToScreen(100, 0, nnn, 1, 0);
ooo = nnn;*/
}
//---------------------------------------------------------------------------
WLS1.update();
WLS2.update();
WLS_tank.update();
// if (WLS2.update())
//{
if (WLS2.read()==0 ) //если второй сенсор сработал на затопление, то выключаем помпу
{
digitalWrite(pin_RelayON, LOW); //отключаем помпу долива воды
SendToScreen(0, 0, "Pomp OFF", 1, 1);
}
//}
//if (WLS_tank.update())
//{
if(WLS_tank.read()==0) //если в емкости закончилась вода
{
digitalWrite(pin_RelayON, LOW); //отключаем помпу долива воды
SendToScreen(0, 0, "Fill water tank", 1, 1);
}
//}
/*if (WLS1.update())
{
SendToScreen(0, 0, "WLS1.read()..." + WLS1.read(), 1, 1);
}
*/
if (WLS1.read()==0 and WLS2.read()==1 and WLS_tank.read()==1) //если оба сенсора сработали на осушение и в емкости для долива есть вода, то включаем помпу на долив
{
digitalWrite(pin_RelayON, HIGH); //начинам долив воды
SendToScreen(0, 0, "Pomp ON", 1, 1);
}
}