Выкладываю код программы, на следующей неделе скину полные фото устройства и перефирии, а также видео его работы.
Комментировать код полностью пока лень, чуть позже возможно это сделаю!
// определение режима соединения и подключение библиотек
#define REMOTEXY_MODE__SOFTSERIAL
#include <SoftwareSerial.h>
#include <TimerOne.h>
#include <RemoteXY.h>
#include <EEPROM.h>
// настройки соединения
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600
// конфигурация интерфейса
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255,8,0,102,0,222,2,8,200,1,
130,0,1,1,61,6,96,130,0,1,
37,61,10,96,130,0,1,70,30,14,
96,2,1,2,75,28,8,2,26,16,
31,32,208,146,208,154,208,155,0,208,
158,208,162,208,154,208,155,0,130,0,
1,85,30,14,96,129,0,6,86,21,
3,24,208,160,209,131,209,135,208,189,
208,176,209,143,32,208,191,208,190,208,
180,208,176,209,135,208,176,0,1,2,
2,90,28,8,2,16,208,159,208,158,
208,148,208,144,208,167,208,144,32,32,
32,32,32,0,130,0,1,48,61,10,
96,130,0,1,8,61,6,96,130,0,
32,70,30,29,96,130,0,1,26,61,
10,96,130,0,1,15,61,10,96,130,
0,1,59,61,10,96,129,0,2,60,
31,3,24,208,156,208,190,209,137,208,
189,208,190,209,129,209,130,209,140,32,
208,189,208,176,209,129,208,190,209,129,
208,176,44,32,37,0,129,0,2,16,
42,3,24,208,146,208,187,208,176,208,
182,208,189,208,190,209,129,209,130,209,
140,32,208,188,208,184,208,189,208,184,
208,188,208,176,208,187,209,140,208,189,
208,176,209,143,44,32,37,0,129,0,
2,27,43,3,24,208,146,208,187,208,
176,208,182,208,189,208,190,209,129,209,
130,209,140,32,208,188,208,176,208,186,
209,129,208,184,208,188,208,176,208,187,
209,140,208,189,208,176,209,143,44,32,
37,0,129,0,2,10,34,3,24,208,
146,208,187,208,176,208,182,208,189,208,
190,209,129,209,130,209,140,32,209,130,
208,181,208,186,209,131,209,137,208,176,
209,143,44,32,37,0,129,0,2,38,
25,3,24,208,146,209,128,208,181,208,
188,209,143,32,208,191,208,190,208,187,
208,184,208,178,208,176,44,32,209,129,
0,129,0,2,49,29,3,24,208,146,
209,128,208,181,208,188,209,143,32,208,
190,208,182,208,184,208,180,208,176,208,
189,208,184,209,143,44,32,209,135,0,
4,128,2,63,47,5,32,26,4,128,
2,19,47,5,204,26,4,128,2,30,
47,5,1,26,4,128,2,52,47,5,
217,26,4,128,2,41,47,5,135,26,
3,131,33,75,28,10,2,26,129,0,
33,87,20,3,24,208,144,32,45,32,
34,208,146,208,155,208,144,208,150,208,
157,208,158,208,161,208,162,208,172,34,
0,129,0,33,91,18,3,24,66,32,
45,32,34,208,146,208,160,208,149,208,
156,208,175,34,0,129,0,33,95,15,
3,24,208,161,32,45,32,34,208,160,
208,163,208,167,208,157,208,158,208,153,
34,0,67,5,50,9,11,4,2,32,
11,67,5,50,16,11,8,2,26,11,
67,5,50,27,11,8,2,26,11,67,
5,50,38,11,4,2,26,11,67,5,
50,49,11,4,2,26,11,67,5,50,
60,11,8,2,26,11,129,0,43,71,
9,3,24,208,160,208,181,208,182,208,
184,208,188,0,129,0,12,71,10,3,
24,208,160,208,176,208,177,208,190,209,
130,208,176,0,67,5,50,42,11,4,
2,32,11,67,5,50,53,11,4,2,
32,11,67,5,50,2,11,4,2,32,
11,129,0,2,3,40,3,24,208,158,
208,177,209,137,208,181,208,181,32,208,
186,208,190,208,187,208,184,209,135,208,
181,209,129,209,130,208,178,208,190,32,
208,191,208,190,208,187,208,184,208,178,
208,190,208,178,0,65,7,23,91,6,
6 };
// структура определяет все переменные вашего интерфейса управления
struct {
// входные переменные
uint8_t switch_1; // =1 если переключатель включен и =0 если отключен
uint8_t button_1; // =1 если кнопка нажата, иначе =0
int8_t slider_5; // =0..100 положение слайдера
int8_t slider_1; // =0..100 положение слайдера
int8_t slider_2; // =0..100 положение слайдера
int8_t slider_4; // =0..100 положение слайдера
int8_t slider_3; // =0..100 положение слайдера
uint8_t select_1; // =0 если переключатель в положении A, =1 если в положении B, =2 если в положении C, ...
// выходнные переменные
char text_1[11]; // =строка UTF8 оканчивающаяся нулем
char text_2[11]; // =строка UTF8 оканчивающаяся нулем
char text_3[11]; // =строка UTF8 оканчивающаяся нулем
char text_4[11]; // =строка UTF8 оканчивающаяся нулем
char text_5[11]; // =строка UTF8 оканчивающаяся нулем
char text_6[11]; // =строка UTF8 оканчивающаяся нулем
char text_7[11]; // =строка UTF8 оканчивающаяся нулем
char text_8[11]; // =строка UTF8 оканчивающаяся нулем
char text_9[11]; // =строка UTF8 оканчивающаяся нулем
uint8_t led_1_r; // =0..255 яркость красного цвета индикатора
uint8_t led_1_g; // =0..255 яркость зеленого цвета индикатора
uint8_t led_1_b; // =0..255 яркость синего цвета индикатора
// дополнительные переменные
uint8_t connect_flag; // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
// переменные проекта
int h=0;
boolean s=false;
unsigned long time=0;
byte h_min, h_max, t_p, t_o, p, w, on, m, mm, n;
byte h_min_e, h_max_e, t_p_e, t_o_e, p_e, w_e, on_e, mm_e, n_e;
// настройка
void setup()
{
RemoteXY_Init ();
Serial.begin(9600);
Timer1.initialize();
Timer1.attachInterrupt(Timer1_action);
pinMode(6, OUTPUT);
digitalWrite(6, LOW);
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
h_min_e=EEPROM.read(0);
h_max_e=EEPROM.read(1);
t_p_e=EEPROM.read(2);
t_o_e=EEPROM.read(3);
p_e=EEPROM.read(4);
w_e=EEPROM.read(5);
mm_e=EEPROM.read(6);
n=n_e=EEPROM.read(7);
RemoteXY.slider_1=h_min_e;
RemoteXY.slider_2=h_max_e;
RemoteXY.slider_3=t_p_e;
RemoteXY.slider_4=t_o_e;
RemoteXY.slider_5=p_e;
RemoteXY.switch_1=w_e;
RemoteXY.select_1=mm_e;
}
// цикл
void loop()
{
RemoteXY_Handler ();
digitalWrite(7, RemoteXY.connect_flag);
h=100-analogRead(0)/10.24;
h_min=RemoteXY.slider_1;
if (h_min!=h_min_e)
{
EEPROM.write(0, h_min);
h_min_e=h_min;
}
h_max=RemoteXY.slider_2;
if (h_max!=h_max_e)
{
EEPROM.write(1, h_max);
h_max_e=h_max;
}
t_p=RemoteXY.slider_3;
if (t_p!=t_p_e)
{
EEPROM.write(2, t_p);
t_p_e=t_p;
}
t_o=RemoteXY.slider_4;
if (t_o!=t_o_e)
{
EEPROM.write(3, t_o);
t_o_e=t_o;
}
p=RemoteXY.slider_5;
if (p!=p_e)
{
EEPROM.write(4, p);
p_e=p;
}
w=RemoteXY.switch_1;
if (w!=w_e)
{
EEPROM.write(5, w);
w_e=w;
}
mm=RemoteXY.select_1;
if (mm!=mm_e)
{
EEPROM.write(6, mm);
mm_e=mm;
}
on=RemoteXY.button_1;
itoa(h, RemoteXY.text_1, 10);
itoa(h_min/2.5, RemoteXY.text_2, 10);
itoa((h_max+100)/2, RemoteXY.text_3, 10);
itoa(t_p/2.2+5, RemoteXY.text_4, 10);
itoa(t_o/1.0417+1, RemoteXY.text_5, 10);
itoa((p+100)/2, RemoteXY.text_6, 10);
if (n==255) { n=0; }
itoa(n, RemoteXY.text_9, 10);
if (n!=n_e)
{
EEPROM.write(7, n);
n_e=n;
}
if (s==true && m==1)
{
itoa(time, RemoteXY.text_7, 10);
itoa(t_o/1.0417+1, RemoteXY.text_8, 10);
}
if (s==false && m==1)
{
itoa(t_p/2.2+5, RemoteXY.text_7, 10);
itoa(time, RemoteXY.text_8, 10);
}
if (m!=1 && w==1)
{
itoa(t_p/2.2+5, RemoteXY.text_7, 10);
itoa(t_o/1.0417+1, RemoteXY.text_8, 10);
}
if (mm!=m)
{
m=mm;
analogWrite(5,0);
time=0;
s=false;
itoa(t_p/2.2+5, RemoteXY.text_7, 10);
itoa(t_o/1.0417+1, RemoteXY.text_8, 10);
RemoteXY.led_1_r=20;
RemoteXY.led_1_g=20;
RemoteXY.led_1_r=20;
}
if (w==0 )
{
analogWrite(5,0);
digitalWrite(6, LOW);
digitalWrite(8, HIGH);
time=0;
s=false;
itoa(t_p/2.2+5, RemoteXY.text_7, 10);
itoa(t_o/1.0417+1, RemoteXY.text_8, 10);
RemoteXY.led_1_r=20;
RemoteXY.led_1_g=20;
RemoteXY.led_1_r=20;
}
if (w==1)
{
switch (m)
{
// режим "Влажность"
case 0:
if (h<h_min && s==false)
{
n++;
s=true;
analogWrite(5, p*2.55);
digitalWrite(6, HIGH);
digitalWrite(8, LOW);
}
if (h>=h_max && s==true)
{
s=false;
analogWrite(5, 0);
digitalWrite(6, LOW);
digitalWrite(8, HIGH);
}
break;
// режим "Время"
case 1:
if (time>=(t_o/1.0417+1)/**3600*/ && s==false)
{
analogWrite(5, p*2.55);
digitalWrite(6, HIGH);
digitalWrite(8, LOW);
time=0;
s=true;
n++;
}
if (time>=t_p/2.2+5 && s==true)
{
analogWrite(5, 0);
digitalWrite(6, LOW);
digitalWrite(8, HIGH);
time=0;
s=false;
}
break;
// режим "Ручной"
case 2:
RemoteXY.led_1_r=0;
RemoteXY.led_1_g=255;
RemoteXY.led_1_r=0;
if (on==1)
{
analogWrite(5, p*2.55);
digitalWrite(6, HIGH);
digitalWrite(8, LOW);
}
else
{
analogWrite(5, 0);
digitalWrite(6, LOW);
digitalWrite(8, HIGH);
}
break;
}
}
}
void Timer1_action()
{
time++;
}