Передача состояния порта по UART

geniusbsd
Offline
Зарегистрирован: 23.02.2016

Добрый день

Придесловие

Попалось мне в руки китайское устройство  http://www.nitwo.com/sell-wifi_8do_8di_module_8relay_220v_5a_network_ethernet_wifi_control_android_mobile-1876150.html 

Железо Atmega32A WIFI H-link RM04 на входах и выходах стоят оптроны PORTA INPUT PORTD OTPUT

Управляется только через свою китайскую программу. Захотел подключить его к системе умного дома

Написал прошивку для своих целей

Обработка кнопок каждая кнопка включает/выключает свое реле  

Работа с wifi по статье забугорного товарища http://83.56.32.125/wifirm04.html

Так вот все работает отлично хочу добавить обратную связь т.е. Контролер умного дома через инет опрашивает железяку каждые пять минут и должен получить состояние реле включено или выключено

Кусок кода По hf,jnt WIFI

boolean has_request = false;
  String in = "";
  if (Serial.available()) {
    in = "";
    while (true) {  // should add time out here
      while (Serial.available() == false) {}
      in += (char)(Serial.read());
      if (in.endsWith("\r\n\r\n")) {
        has_request = true;  break;
      }
    }   
  }
  if (has_request) {
    int i1 = in.indexOf("GET /relay?f="), i2;
    if (i1 != -1) {
      i2 = in.indexOf(" ", i1+13);
      f = in.substring(i1+13, i2).toInt();
    }
    Serial.println("HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close");
    String sr = "<!DOCTYPE HTML                           >\n";  //??NO QUITAR ESPACIOS EN BLANCO!!
  
    Serial.print("Content-Length: ");
    Serial.print(sr.length());
    Serial.print("\r\n\r\n");
    if (f==10) { Serial.println("Реле1: Выключено"); } 
    if (f==11) { Serial.println("Реле1: Включено"); } 
    if (f==12) { Serial.println(relayON1, DEC); }   
    Serial.print(sr);
    has_request = false;  
  }

switch (f){
  case 10:
 digitalWrite(Relay1, HIGH);
 relayON1=0;
   break;
  case 11:
   digitalWrite(Relay1, LOW);
   relayON1=1;
   break;

   f=0;   
}  

Загвоздка в том что команда  if (f==12) { Serial.println(relayON1, DEC); } выдает всегда 1

relayON1 - integer флаг включения реле используемый при управлении кнопка и через GET Запросы

Так же пробовал if (f==12) { Serial.println(digitalRead(Relay1), DEC); } так же всегда 1

В чем может быть проблема?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Что выводится в Сериал при f=10 или f=11?

geniusbsd
Offline
Зарегистрирован: 23.02.2016

kisoft пишет:
Что выводится в Сериал при f=10 или f=11?

При f =10 выводится Реле1: Выключено

При f =11 выводится Реле1: Включено

При f =12 выводится "1" - если даже  реле выключено

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Как и где описаны переменные relayON1 и f?

Здесь ещё в конце switch "странная" конструкция f = 0; хоть это и не особенно важно, но все таки после break напрашивается закрывающаяся фигурная скобка.

UPD: и да, на какой Ардуине этот скетч выполняется?

 

 

geniusbsd
Offline
Зарегистрирован: 23.02.2016

kisoft пишет:

Как и где описаны переменные relayON1 и f?

Здесь ещё в конце switch "странная" конструкция f = 0; хоть это и не особенно важно, но все таки после break напрашивается закрывающаяся фигурная скобка.

UPD: и да, на какой Ардуине этот скетч выполняется?

relayON1 - relayON8 описываются в самом начале до процедуры setup()

f описывается между setup и loop это не важно

По поводу f=0 из теории С конструкця swich case любое действие  после break  будет выполняться код 

По поводу платформы я писал что это китайская железяка на атмега32а для того что б подружить ее с Arduino IDE я прописал в файл боард 

##############################################################


mega32-16.name=ATmega32a-External 16mhz
mega32-16.build.mcu=atmega32
mega32-16.build.f_cpu=16000000L
mega32-16.build.core=arduino:arduino
mega32-16.build.variant=mega32aTQFP
mega32-16.build.board=AVR_MEGA32-16
mega32-16.upload.tool=avrdude
mega32-16.upload.maximum_size=32000

mega32-16.bootloader.low_fuses=0xEF
mega32-16.bootloader.high_fuses=0x89
#mega32-16.bootloader.extended_fuses=0xFD

##############################################################

в файл варинт написал следующие 


#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#include <avr/pgmspace.h>

static const uint8_t SDA	= 20;
static const uint8_t SCL	= 19;

static const uint8_t MISO	= 2;
static const uint8_t MOSI	= 1;
static const uint8_t SCK	= 3;
static const uint8_t SS		= 44;

#ifdef ARDUINO_MAIN

#define PA 1
#define PB 2
#define PC 3
#define PD 4

const uint16_t PROGMEM port_to_mode_PGM[5] = {
	NOT_A_PORT,
	(uint16_t) &DDRA,
	(uint16_t) &DDRB,
	(uint16_t) &DDRC,
	(uint16_t) &DDRD,
};

const uint16_t PROGMEM port_to_output_PGM[5] = {
	NOT_A_PORT,
	(uint16_t) &PORTA,
	(uint16_t) &PORTB,
	(uint16_t) &PORTC,
	(uint16_t) &PORTD,
};

const uint16_t PROGMEM port_to_input_PGM[5] = {
	NOT_A_PIN,
	(uint16_t) &PINA,
	(uint16_t) &PINB,
	(uint16_t) &PINC,
	(uint16_t) &PIND,
};

const uint8_t PROGMEM digital_pin_to_port_PGM[32] = {
	PB,  // PB0 ** D0
	PB,  // PB1 ** D1
	PB,  // PB2 ** D2
	PB,  // PB3 ** D3
	PB,  // PB4 ** D4
	PB,  // PB5 ** D5
	PB,  // PB6 ** D6
	PB,  // PB7 ** D7
	PD,  // PD0 ** D8
	PD,  // PD1 ** D9
	PD,  // PD2 ** D10
	PD,  // PD3 ** D11
	PD,  // PD4 ** D12
	PD,  // PD5 ** D13
	PD,  // PD6 ** D14
	PD,  // PD7 ** D15
	PC,  // PC0 ** D16
	PC,  // PC1 ** D17
	PC,  // PC2 ** D18
	PC,  // PC3 ** D19
	PC,  // PC4 ** D20
	PC,  // PC5 ** D21
	PC,  // PC6 ** D22
	PC,  // PC7 ** D23
	PA,  // PA7 ** A0 D24
	PA,  // PA6 ** A1 D25
	PA,  // PA5 ** A2 D26
	PA,  // PA4 ** A3 D27
	PA,  // PA3 ** A4 D28
	PA,  // PA2 ** A5 D29
	PA,  // PA1 ** A6 D30
	PA,  // PA0 ** A7 D31
};

const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[32] = {	
	_BV(0),  // PB0 ** D0
	_BV(1),  // PB1 ** D1
	_BV(2),  // PB2 ** D2
	_BV(3),  // PB3 ** D3
	_BV(4),  // PB4 ** D4
	_BV(5),  // PB5 ** D5
	_BV(6),  // PB6 ** D6
	_BV(7),  // PB7 ** D7
	_BV(0),  // PD0 ** D8
	_BV(1),  // PD1 ** D9
	_BV(2),  // PD2 ** D10
	_BV(3),  // PD3 ** D11
	_BV(4),  // PD4 ** D12
	_BV(5),  // PD5 ** D13
	_BV(6),  // PD6 ** D14
	_BV(7),  // PD7 ** D15
	_BV(0),  // PC0 ** D16
	_BV(1),  // PC1 ** D17
	_BV(2),  // PC2 ** D18
	_BV(3),  // PC3 ** D19
	_BV(4),  // PC4 ** D20
	_BV(5),  // PC5 ** D21
	_BV(6),  // PC6 ** D22
	_BV(7),  // PC7 ** D23
	_BV(7),  // PA7 ** A0 D24
	_BV(6),  // PA6 ** A1 D25
	_BV(5),  // PA5 ** A2 D26
	_BV(4),  // PA4 ** A3 D27
	_BV(3),  // PA3 ** A4 D28
	_BV(2),  // PA2 ** A5 D29
	_BV(1),  // PA1 ** A6 D30
	_BV(0),  // PA0 ** A7 D31
};

const uint8_t PROGMEM digital_pin_to_timer_PGM[32] = {
	NOT_ON_TIMER,  // PB0 ** D0
	NOT_ON_TIMER,  // PB1 ** D1
	NOT_ON_TIMER,  // PB2 ** D2
	TIMER0A,      // PB3 ** D3
	NOT_ON_TIMER,  // PB4 ** D4
	NOT_ON_TIMER,  // PB5 ** D5
	NOT_ON_TIMER,  // PB6 ** D6
	NOT_ON_TIMER,  // PB7 ** D7
	NOT_ON_TIMER,  // PD0 ** D8
	NOT_ON_TIMER,  // PD1 ** D9
	NOT_ON_TIMER,  // PD2 ** D10
	NOT_ON_TIMER,  // PD3 ** D11
	TIMER1B,	   // PD4 ** D12
	TIMER1A,	   // PD5 ** D13
	NOT_ON_TIMER,  // PD6 ** D14
	TIMER2,		   // PD7 ** D15
	NOT_ON_TIMER,  // PC0 ** D16
	NOT_ON_TIMER,  // PC1 ** D17
	NOT_ON_TIMER,  // PC2 ** D18
	NOT_ON_TIMER,  // PC3 ** D19
	NOT_ON_TIMER,  // PC4 ** D20
	NOT_ON_TIMER,  // PC5 ** D21
	NOT_ON_TIMER,  // PC6 ** D22
	NOT_ON_TIMER,  // PC7 ** D23
	NOT_ON_TIMER,  // PA7 ** A0 D24
	NOT_ON_TIMER,  // PA6 ** A1 D25
	NOT_ON_TIMER,  // PA5 ** A2 D26
	NOT_ON_TIMER,  // PA4 ** A3 D27
	NOT_ON_TIMER,  // PA3 ** A4 D28
	NOT_ON_TIMER,  // PA2 ** A5 D29
	NOT_ON_TIMER,  // PA1 ** A6 D30
	NOT_ON_TIMER,  // PA0 ** A7 D31
};

#endif

Ну и сам скетч кривой косой секретов нет , но работающий в принципе, могу проверить работу на ардуино нано

/*
 Реле 8  - PA7 Arduino D24
Реле 7  - PA6 Arduino D25
Реле 6  - PA5 Arduino D26
Реле 5  - PA4 Arduino D27
Реле 4  - PA0 Arduino D31
Реле 3  - PA1 Arduino D30
Реле 2  - PA2 Arduino D29
Реле 1  - PA3 Arduino D28
 */

int Relay4 = 31;
int Relay3 = 30;
int Relay2 = 29;
int Relay1 = 28;
int Relay5 = 27;
int Relay6 = 26;
int Relay7 = 25;
int Relay8 = 24;
int SW1 =13; 
int SW2 =15;
int SW3 =19;
int SW4 =18;
int SW5 =20; 
int SW6 =21;
int SW7 =22;     
int SW8 = 23;
int relayON1 = 0;
int relayON2 = 0;
int relayON3 = 0;
int relayON4 = 0; 
int relayON5 = 0;
int relayON6 = 0;
int relayON7 = 0;
int relayON8 = 0;
void setup() {      
  
  pinMode(Relay1, OUTPUT); //Rele 1
  pinMode(Relay2, OUTPUT);  //Rele 2
  pinMode(Relay3, OUTPUT);  //Rele 3
  pinMode(Relay4, OUTPUT);  //Rele 4
  pinMode(Relay5, OUTPUT);  //Rele 5
  pinMode(Relay6, OUTPUT);  //Rele 6
  pinMode(Relay7, OUTPUT);  //Rele 7
  pinMode(Relay8, OUTPUT);  //Rele 8
  pinMode(SW1,INPUT);
  pinMode(SW2,INPUT);
  pinMode(SW3,INPUT);
  pinMode(SW4,INPUT);
  pinMode(SW5,INPUT);
  pinMode(SW6,INPUT);
  pinMode(SW7,INPUT);
  pinMode(SW8,INPUT);
   
  PORTA=0xFF;
  UBRRH = 0;
  UBRRL = 16; //51 скорость обмена 9600 бод 8000000/(16*9600) – 1
  //разр. прерыв при приеме, разр приема, разр передачи.
  UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);  
  //обращаемся к регистру UCSRS, размер слова – 8 бит
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); 
  
}

int f = 0;
void loop()
{ 
  /////////////////////////////////////////////////////////////////////
 if(digitalRead(SW1)== HIGH && relayON1 == 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON1=1;}
  if(digitalRead(SW1)== LOW && relayON1 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay1,!digitalRead(Relay1));
     delay(500);
     relayON1=0;}
///////////////////////////////////////////////////////////////////////////////////////////////
     if(digitalRead(SW2)== HIGH && relayON2== 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON2=1;}
  if(digitalRead(SW2)== LOW && relayON2 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay2,!digitalRead(Relay2));
     delay(500);
     relayON2=0;}
//////////////////////////////////////////////////////////////////////////////////

 ///////////////////////////////////////////////////////////////////////////////////////////////
     if(digitalRead(SW3)== HIGH && relayON3== 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON3=1;}
  if(digitalRead(SW3)== LOW && relayON3 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay3,!digitalRead(Relay3));
     delay(500);
     relayON3=0;}
//////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
     if(digitalRead(SW4)== HIGH && relayON4== 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON4=1;}
  if(digitalRead(SW4)== LOW && relayON4 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay4,!digitalRead(Relay4));
     delay(500);
     relayON4=0;}
//////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
     if(digitalRead(SW5)== HIGH && relayON5== 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON5=1;}
  if(digitalRead(SW5)== LOW && relayON5 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay5,!digitalRead(Relay5));
     delay(500);
     relayON5=0;}
//////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
     if(digitalRead(SW6)== HIGH && relayON6== 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON6=1;}
  if(digitalRead(SW6)== LOW && relayON6 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay6,!digitalRead(Relay6));
     delay(500);
     relayON6=0;}
//////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
     if(digitalRead(SW7)== HIGH && relayON7== 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON7=1;}
  if(digitalRead(SW7)== LOW && relayON7 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay7,!digitalRead(Relay7));
     delay(500);
     relayON7=0;}
//////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
     if(digitalRead(SW8)== HIGH && relayON8== 0)//если кнопка нажата  и перемення flag равна 0 , то ...
     {relayON8=1;}
  if(digitalRead(SW8)== LOW && relayON8 == 1)//если кнопка НЕ нажата  и переменная flag равна - 1 ,то ..
     {
     digitalWrite(Relay8,!digitalRead(Relay8));
     delay(500);
     relayON8=0;}
//////////////////////////////////////////////////////////////////////////////////

boolean has_request = false;
  String in = "";
  if (Serial.available()) {
    in = "";
    while (true) {  // should add time out here
      while (Serial.available() == false) {}
      in += (char)(Serial.read());
      if (in.endsWith("\r\n\r\n")) {
        has_request = true;  break;
      }
    }   
  }
  if (has_request) {
    int i1 = in.indexOf("GET /relay?f="), i2;
    if (i1 != -1) {
      i2 = in.indexOf(" ", i1+13);
      f = in.substring(i1+13, i2).toInt();
    }
    Serial.println("HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close");
    String sr = "<!DOCTYPE HTML                           >\n";  //??NO QUITAR ESPACIOS EN BLANCO!!
  
    Serial.print("Content-Length: ");
    Serial.print(sr.length());
    Serial.print("\r\n\r\n");
    if (f==10) { Serial.println("Реле1: Выключено"); } 
    if (f==11) { Serial.println("Реле1: Включено"); } 
    if (f==12) { Serial.println(relayON1, DEC); } 
    if (f==20) { Serial.println("Реле2: Выключено"); } 
    if (f==21) { Serial.println("Реле2: Включено"); }  
    if (f==22) { Serial.println(relayON2, DEC); }  
    if (f==30) { Serial.println("Реле3: Выключено"); } 
    if (f==31) { Serial.println("Реле3: Включено"); }
    if (f==32) { Serial.println(relayON3, DEC); }  
    if (f==40) { Serial.println("Реле4: Выключено"); } 
    if (f==41) { Serial.println("Реле4: Включено"); }
    if (f==42) { Serial.println(relayON4, DEC); }  
    if (f==50) { Serial.println("Реле5: Выключено"); } 
    if (f==51) { Serial.println("Реле5: Включено"); }
    if (f==52) { Serial.println(relayON5, DEC); }  
    if (f==60) { Serial.println("Реле6: Выключено"); } 
    if (f==61) { Serial.println("Реле6: Включено"); } 
    if (f==62) { Serial.println(relayON6, DEC); } 
    if (f==70) { Serial.println("Реле7: Выключено"); } 
    if (f==71) { Serial.println("Реле7: Включено"); } 
    if (f==72) { Serial.println(relayON7, DEC); } 
    if (f==80) { Serial.println("Реле8: Выключено"); } 
    if (f==81) { Serial.println("Реле8: Включено"); }
    if (f==82) { Serial.println(relayON8, DEC); } 
    if (f==90) { Serial.println("Выключено Все"); }
    if (f==91) { Serial.println("Включено Все"); }     
    Serial.print(sr);
    has_request = false;
    
  }

switch (f){
  case 10:
 digitalWrite(Relay1, HIGH);
 relayON1=0;
   break;
  case 11:
   digitalWrite(Relay1, LOW);
   relayON1=1;
   break;
    case 20:
 digitalWrite(Relay2, HIGH);
 relayON2=0;
   break;
  case 21:
   digitalWrite(Relay2, LOW);
   relayON2=1;
   break;
 case 30:
 digitalWrite(Relay3, HIGH);
 relayON3=0;
   break;
  case 31:
   digitalWrite(Relay3, LOW);
   relayON3=1;
   break;
 case 40:
 digitalWrite(Relay4, HIGH);
 relayON4=0;
   break;
  case 41:
   digitalWrite(Relay4, LOW);
   relayON4=1;
   break;
 case 50:
 digitalWrite(Relay5, HIGH);
 relayON5=0;
   break;
  case 51:
   digitalWrite(Relay5, LOW);
   relayON5=1;
   break;
    case 60:
 digitalWrite(Relay6, HIGH);
 relayON6=0;
   break;
  case 61:
   digitalWrite(Relay6, LOW);
   relayON6=1;
   break;
 case 70:
 digitalWrite(Relay7, HIGH);
 relayON7=0;
   break;
  case 71:
   digitalWrite(Relay7, LOW);
   relayON7=1;
   break;
    case 80:
 digitalWrite(Relay8, HIGH);
 relayON8=0;
   break;
  case 81:
   digitalWrite(Relay8, LOW);
   relayON8=1;
   break;
     case 90:
 digitalWrite(Relay1, HIGH);
 relayON8=1;
 digitalWrite(Relay2, HIGH);
 relayON2=0;
 digitalWrite(Relay3, HIGH);
 relayON3=0;
 digitalWrite(Relay4, HIGH);
 relayON4=0;
 digitalWrite(Relay5, HIGH);
 relayON5=0;
 digitalWrite(Relay6, HIGH);
 relayON6=0;
 digitalWrite(Relay7, HIGH);
 relayON7=0;
 digitalWrite(Relay8, HIGH);
 relayON8=0;
   break;
  case 91:
   digitalWrite(Relay1, LOW);
   relayON1=1;
    digitalWrite(Relay2, LOW);
   relayON2=1;
    digitalWrite(Relay3, LOW);
   relayON3=1;
    digitalWrite(Relay4, LOW);
   relayON4=1;
    digitalWrite(Relay5, LOW);
   relayON5=1;
    digitalWrite(Relay6, LOW);
   relayON6=1;
    digitalWrite(Relay7, LOW);
   relayON7=1;
    digitalWrite(Relay8, LOW);
   relayON8=1;
   break;
   
   f=0;   
}  

}

сильно не пинайте плиз


 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Строки 71-75 говорят о том, что если кнопка не нажата, а relayON1 =1, то оно должно сброситься в 0.
Здесь нет проверки на дребезг кнопок, значит нажатие кнопок будет звенеть (многократно срабатывать), если нажать или отпустить кнопку.
Про switch, не проще сбросить f в 0 после switch, зачем такая сложная конструкция?
Я бы порекомендовал закрыть код кнопок для отладки, потому что он может только помешать отладке.
Могу только порекомендовать посмотреть все точки, где relayON1 устанавливается в 1, себе лучше вывести на монитор.

geniusbsd
Offline
Зарегистрирован: 23.02.2016

Переписал вот таким образом но возникла проблема другая  если реле вкл/выкл GET запросом то при нажатии кномки оно срабатывает и возвращается в положение последней команды GET запроса

Реле 8  - PA7 Arduino D24
Реле 7  - PA6 Arduino D25
Реле 6  - PA5 Arduino D26
Реле 5  - PA4 Arduino D27
Реле 4  - PA0 Arduino D31
Реле 3  - PA1 Arduino D30
Реле 2  - PA2 Arduino D29
Реле 1  - PA3 Arduino D28
 */

int Relay4 = 31;
int Relay3 = 30;
int Relay2 = 29;
int Relay1 = 28;
int Relay5 = 27;
int Relay6 = 26;
int Relay7 = 25;
int Relay8 = 24;
int SW1 =13; 
int SW2 =15;
int SW3 =19;
int SW4 =18;
int SW5 =20; 
int SW6 =21;
int SW7 =22;     
int SW8 = 23;
int relayON1 = 0;
int relayON2 = 0;
int relayON3 = 0;
int relayON4 = 0; 
int relayON5 = 0;
int relayON6 = 0;
int relayON7 = 0;
int relayON8 = 0;
void setup() {      
  
  pinMode(Relay1, OUTPUT); //Rele 1
  pinMode(Relay2, OUTPUT);  //Rele 2
  pinMode(Relay3, OUTPUT);  //Rele 3
  pinMode(Relay4, OUTPUT);  //Rele 4
  pinMode(Relay5, OUTPUT);  //Rele 5
  pinMode(Relay6, OUTPUT);  //Rele 6
  pinMode(Relay7, OUTPUT);  //Rele 7
  pinMode(Relay8, OUTPUT);  //Rele 8
  pinMode(SW1,INPUT_PULLUP);
  pinMode(SW2,INPUT_PULLUP);
  pinMode(SW3,INPUT);
  pinMode(SW4,INPUT);
  pinMode(SW5,INPUT);
  pinMode(SW6,INPUT);
  pinMode(SW7,INPUT);
  pinMode(SW8,INPUT);
   
  PORTA=0xFF;
  UBRRH = 0;
  UBRRL = 16; //51 скорость обмена 9600 бод 8000000/(16*9600) – 1
  //разр. прерыв при приеме, разр приема, разр передачи.
  UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);  
  //обращаемся к регистру UCSRS, размер слова – 8 бит
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); 
  
}

int f = 0;
void loop()
{ 
   if(digitalRead(SW1) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay1, !digitalRead(Relay1));   
     relayON1=!relayON1;
      delay(500);
    }

    if(digitalRead(SW2) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay2, !digitalRead(Relay2));        // то переключаем состояние LedPin
      relayON2=!relayON2;
      delay(500);
    }

    if(digitalRead(SW3) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay3, !digitalRead(Relay3));        // то переключаем состояние LedPin
       relayON3=!relayON3;
      delay(500);
    }
    if(digitalRead(SW4) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay4, !digitalRead(Relay4));        // то переключаем состояние LedPin
       relayON4=!relayON4;
      delay(500);
    }

if(digitalRead(SW5) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay5, !digitalRead(Relay5));        // то переключаем состояние LedPin
      relayON5=!relayON5;
      delay(500);
    }
    if(digitalRead(SW6) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay6, !digitalRead(Relay6));        // то переключаем состояние LedPin
       relayON6=!relayON6;
      delay(500);
    }
    if(digitalRead(SW7) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay7, !digitalRead(Relay7));        // то переключаем состояние LedPin
       relayON7=!relayON7;
      delay(500);
    }
    if(digitalRead(SW8) == LOW)        // если кнопка нажата
    { 
      digitalWrite(Relay8, !digitalRead(Relay8));        // то переключаем состояние LedPin
       relayON8=!relayON8;
      delay(500);
    }
boolean has_request = false;
  String in = "";
  if (Serial.available()) {
    in = "";
    while (true) {  // should add time out here
      while (Serial.available() == false) {}
      in += (char)(Serial.read());
      if (in.endsWith("\r\n\r\n")) {
        has_request = true;  break;
      }
    }   
  }
  if (has_request) {
    int i1 = in.indexOf("GET /relay?f="), i2;
    if (i1 != -1) {
      i2 = in.indexOf(" ", i1+13);
      f = in.substring(i1+13, i2).toInt();
    }
    Serial.println("HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close");
    String sr = "<!DOCTYPE HTML                           >\n";  //??NO QUITAR ESPACIOS EN BLANCO!!
  
    Serial.print("Content-Length: ");
    Serial.print(sr.length());
    Serial.print("\r\n\r\n");
    if (f==10) { Serial.println("Реле1: Выключено"); } 
    if (f==11) { Serial.println("Реле1: Включено"); } 
    if (f==12) {Serial.println(relayON1, DEC); } 
    if (f==20) { Serial.println("Реле2: Выключено"); } 
    if (f==21) { Serial.println("Реле2: Включено"); }  
    if (f==22) {Serial.println(relayON2, DEC); }  
    if (f==30) { Serial.println("Реле3: Выключено"); } 
    if (f==31) { Serial.println("Реле3: Включено"); }
    if (f==32) {Serial.println(relayON3, DEC); }  
    if (f==40) { Serial.println("Реле4: Выключено"); } 
    if (f==41) { Serial.println("Реле4: Включено"); }
    if (f==42) {Serial.println(relayON4, DEC); }  
    if (f==50) { Serial.println("Реле5: Выключено"); } 
    if (f==51) { Serial.println("Реле5: Включено"); }
    if (f==52) {Serial.println(relayON5, DEC); }  
    if (f==60) { Serial.println("Реле6: Выключено"); } 
    if (f==61) { Serial.println("Реле6: Включено"); } 
    if (f==62) {Serial.println(relayON6, DEC); } 
    if (f==70) { Serial.println("Реле7: Выключено"); } 
    if (f==71) { Serial.println("Реле7: Включено"); } 
    if (f==72) {Serial.println(relayON7, DEC); } 
    if (f==80) { Serial.println("Реле8: Выключено"); } 
    if (f==81) { Serial.println("Реле8: Включено"); }
    if (f==82) {Serial.println(relayON8, DEC); } 
    if (f==90) { Serial.println("Выключено Все"); }
    if (f==91) { Serial.println("Включено Все"); }     
    Serial.print(sr);
    has_request = false;
    
  }

switch (f){
  case 10:
 digitalWrite(Relay1, HIGH);
 relayON1=0;
   break;
  case 11:
   digitalWrite(Relay1, LOW);
   relayON1=1;
   break;
    case 20:
 digitalWrite(Relay2, HIGH);
 relayON2=0;
   break;
  case 21:
   digitalWrite(Relay2, LOW);
   relayON2=1;
   break;
 case 30:
 digitalWrite(Relay3, HIGH);
 relayON3=0;
   break;
  case 31:
   digitalWrite(Relay3, LOW);
   relayON3=1;
   break;
 case 40:
 digitalWrite(Relay4, HIGH);
 relayON4=0;
   break;
  case 41:
   digitalWrite(Relay4, LOW);
   relayON4=1;
   break;
 case 50:
 digitalWrite(Relay5, HIGH);
 relayON5=0;
   break;
  case 51:
   digitalWrite(Relay5, LOW);
   relayON5=1;
   break;
    case 60:
 digitalWrite(Relay6, HIGH);
 relayON6=0;
   break;
  case 61:
   digitalWrite(Relay6, LOW);
   relayON6=1;
   break;
 case 70:
 digitalWrite(Relay7, HIGH);
 relayON7=0;
   break;
  case 71:
   digitalWrite(Relay7, LOW);
   relayON7=1;
   break;
    case 80:
 digitalWrite(Relay8, HIGH);
 relayON8=0;
   break;
  case 81:
   digitalWrite(Relay8, LOW);
   relayON8=1;
   break;
     case 90:
 digitalWrite(Relay1, HIGH);
 relayON8=1;
 digitalWrite(Relay2, HIGH);
 relayON2=0;
 digitalWrite(Relay3, HIGH);
 relayON3=0;
 digitalWrite(Relay4, HIGH);
 relayON4=0;
 digitalWrite(Relay5, HIGH);
 relayON5=0;
 digitalWrite(Relay6, HIGH);
 relayON6=0;
 digitalWrite(Relay7, HIGH);
 relayON7=0;
 digitalWrite(Relay8, HIGH);
 relayON8=0;
   break;
  case 91:
   digitalWrite(Relay1, LOW);
   relayON1=1;
    digitalWrite(Relay2, LOW);
   relayON2=1;
    digitalWrite(Relay3, LOW);
   relayON3=1;
    digitalWrite(Relay4, LOW);
   relayON4=1;
    digitalWrite(Relay5, LOW);
   relayON5=1;
    digitalWrite(Relay6, LOW);
   relayON6=1;
    digitalWrite(Relay7, LOW);
   relayON7=1;
    digitalWrite(Relay8, LOW);
   relayON8=1;
   break;
   
   f=0;   
}  

}