Код: Выделить всё
#include <SPI.h>
#include <Ethernet.h>
String command;
boolean RS5on = 0; //Для включения реле 5
boolean incoming = 0;
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(192,168,1,11);
byte remote_ip[] = {192,168,1,10};
EthernetServer server(80);
//Переменные и порты для карнизов
int RELE_1_o = 53;
int RELE_1_z = 39;
int RELE_2_o = 37; //51 был
int RELE_2_z = 49;
int Gerkon_1_o = 47;
int Gerkon_1_z = 45;
int Gerkon_2_o = 43;
int Gerkon_2_z = 41;
boolean sRele_1_o = false;
boolean sRele_1_z = false;
boolean sRele_2_o = false;
boolean sRele_2_z = false;
int ON = 0;
int OFF = 1;
//Для РелеШилд
int RS1 = 22;
int RS2 = 24;
int RS3 = 26;
int RS4 = 28;
int RS5 = 30;
int RS6 = 32;
int RS7 = 34;
int RS8 = 36;
//Для секундной задержки
long interval = 1000;
long MillisR1 = 0;
long MillisR2 = 0;
long MillisR3 = 0;
long MillisR4 = 0;
long MillisR5 = 0;
long MillisR6 = 0;
long MillisR7 = 0;
long MillisR8 = 0;
//Функции
void sendGet(String text) {
EthernetClient client = server.available();
if (client.connect(remote_ip, 80)) {
Serial.println("connected. Send GET");
// отправка GET
client.print("GET ");
client.print(text);
client.print(""); // защитный код
client.println(" HTTP/1.1");
client.println("Host: localhost"); // почему то без этой строки сервер игнорит
client.println("Connection: close");
client.println();
// рвем соединение
client.stop();
}
else {
// почему то не удалось подключиться к серверу
Serial.println("connection failed");
}
}
void setup()
{
// запускаем Ethernet соединение и сервер:
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
//Для карнизов
pinMode(RELE_1_o, OUTPUT);
pinMode(RELE_1_z, OUTPUT);
pinMode(RELE_2_o, OUTPUT);
pinMode(RELE_2_z, OUTPUT);
digitalWrite(RELE_1_o, OFF);
digitalWrite(RELE_1_z, OFF);
digitalWrite(RELE_2_o, OFF);
digitalWrite(RELE_2_z, OFF);
pinMode(Gerkon_1_o, INPUT);
pinMode(Gerkon_1_z, INPUT);
pinMode(Gerkon_2_o, INPUT);
pinMode(Gerkon_2_z, INPUT);
//Для РелеШилд
pinMode(RS1, OUTPUT);
pinMode(RS2, OUTPUT);
pinMode(RS3, OUTPUT);
pinMode(RS4, OUTPUT);
pinMode(RS5, OUTPUT);
pinMode(RS6, OUTPUT);
pinMode(RS7, OUTPUT);
pinMode(RS8, OUTPUT);
digitalWrite(RS1, OFF);
digitalWrite(RS2, OFF);
digitalWrite(RS3, OFF);
digitalWrite(RS4, OFF);
digitalWrite(RS5, OFF);
digitalWrite(RS6, OFF);
digitalWrite(RS7, OFF);
digitalWrite(RS8, OFF);
}
void openWindows()
{
if (digitalRead(Gerkon_1_o) == HIGH) {
digitalWrite(RELE_1_o, ON);
sRele_1_o = true;
}
if (digitalRead(Gerkon_2_o) == HIGH) {
digitalWrite(RELE_2_o, ON);
sRele_2_o = true;
}
}
void closeWindows()
{
if (digitalRead(Gerkon_1_z) == HIGH) {
digitalWrite(RELE_1_z, ON);
sRele_1_z = true;
}
if (digitalRead(Gerkon_2_z) == HIGH) {
digitalWrite(RELE_2_z, ON);
sRele_2_z = true;
}
}
void loop()
{
// ожидание подключения клиентов
EthernetClient client = server.available();
if (client) {
// Запрос HTTP заканчивается пустой строкой
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// считываем URL с символа "$" до первого пробела
if(incoming && c == ' '){
incoming = 0;
}
if(c == '$'){
incoming = 1;
}
// Определяем что было в URL
if(incoming == 1){
Serial.println(c);
if(c == 'o'){
command = "open";
}
if(c == 'z'){
command = "close";
}
if(c == '1'){
command = "r1";
}
if(c == '2'){
command = "r2";
}
if(c == '3'){
command = "r3";
}
if(c == '4'){
command = "r4";
}
if(c == '5'){
command = "r5";
}
if(c == '6'){
command = "r6";
}
if(c == '7'){
command = "r7";
}
if(c == '8'){
command = "r8";
}
if(c == 'a'){
command = "vkl";
}
if(c == 'b'){
command = "vykl";
}
}
if (c == '\n') {
// началась новая строка
//Serial.println("Nachalas novaya stroka");
currentLineIsBlank = true;
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html><head><title>Arduino</title></head><body>");
client.println("</body><html>");
break;
}
else if (c != '\r') {
// в текущей строке ещё есть символы
//Serial.println("V tekuschey stroke ect esche simvoly");
currentLineIsBlank = false;
}
}
}
// даём время браузеру для получения данных
delay(1);
// закрываем соединение
Serial.println("Client STOP");
client.stop();
}
if (command == "open") {
command = "";
openWindows();
}
if (command == "close") {
command = "";
closeWindows();
}
if (command == "r1") {
command = "";
MillisR1 = millis();
digitalWrite(RS1, ON);
}
if (command == "r2") {
command = "";
MillisR2 = millis();
digitalWrite(RS2, ON);
}
if (command == "r3") {
command = "";
MillisR3 = millis();
digitalWrite(RS3, ON);
}
if (command == "r4") {
command = "";
MillisR4 = millis();
digitalWrite(RS4, ON);
}
if (command == "r5") {
command = "";
MillisR5 = millis();
digitalWrite(RS5, ON);
}
if (command == "r6") {
command = "";
MillisR6 = millis();
digitalWrite(RS6, ON);
}
if (command == "r7") {
command = "";
MillisR7 = millis();
digitalWrite(RS7, ON);
}
if (command == "r8") {
command = "";
MillisR8 = millis();
digitalWrite(RS8, ON);
}
if (command == "vkl") {
command = "";
RS5on = 1;
digitalWrite(RS5, ON);
}
if (command == "vykl") {
command = "";
RS5on = 0;
digitalWrite(RS5, OFF);
}
//Выключаем реле, если прошла секунда
unsigned long currentMillis = millis();
if(currentMillis - MillisR1 > interval) {
MillisR1 = 0;
digitalWrite(RS1, OFF);
}
if(currentMillis - MillisR2 > interval) {
MillisR2 = 0;
digitalWrite(RS2, OFF);
}
if(currentMillis - MillisR3 > interval) {
MillisR3 = 0;
digitalWrite(RS3, OFF);
}
if(currentMillis - MillisR4 > interval) {
MillisR4 = 0;
digitalWrite(RS4, OFF);
}
if(currentMillis - MillisR5 > interval) {
MillisR5 = 0;
if (RS5on == 0) {
digitalWrite(RS5, OFF);
}
}
if(currentMillis - MillisR6 > interval) {
MillisR6 = 0;
digitalWrite(RS6, OFF);
}
if(currentMillis - MillisR7 > interval) {
MillisR7 = 0;
digitalWrite(RS7, OFF);
}
if(currentMillis - MillisR8 > interval) {
MillisR8 = 0;
digitalWrite(RS8, OFF);
}
//Остановка моторов карнизов при сработке герконов
if (digitalRead(Gerkon_1_o) == LOW && sRele_1_o == true) {
digitalWrite(RELE_1_o, OFF);
sRele_1_o = false;
if (sRele_2_o == false) {
sendGet("/objects/?script=ShadesOpen");
}
}
if (digitalRead(Gerkon_2_o) == LOW && sRele_2_o == true) {
digitalWrite(RELE_2_o, OFF);
sRele_2_o = false;
if (sRele_1_o == false) {
sendGet("/objects/?script=ShadesOpen");
}
}
if (digitalRead(Gerkon_1_z) == LOW && sRele_1_z == true) {
digitalWrite(RELE_1_z, OFF);
sRele_1_z = false;
if (sRele_2_z == false) {
sendGet("/objects/?script=ShadesClose");
}
}
if (digitalRead(Gerkon_2_z) == LOW && sRele_2_z == true) {
digitalWrite(RELE_2_z, OFF);
sRele_2_z = false;
if (sRele_1_z == false) {
sendGet("/objects/?script=ShadesClose");
}
}
}
Вот последняя версия. Кроме карнизов еще Realy Shield 8 подключен. Принимает команды по Ethernet. Если призодит символ 'o' открывает обе шторы, если 'z' закрывает. Если цифра от 1 до 8 - включает на секунду реле. Может скетч сыроват, но в Ардуино у меня не большой опыт. Работает стабильно уже не первый месяц.