Ethernet shield + Serial

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

парни помогите, я не оставил бэкап рабочего скейча и просто допиливал его и подключал модули, и в какойто момент увидел, что веб морда перестала правильно работать... в общем появилась проблема: при нажатии на кнопки в веб морде, ардуино должна была отправить строку в сериал монитор и эфир, а сейчас отправляет 2 строки причём вторая отличаеться, и я не могу понять где глюк... Суть в том что эта строка через 433 пересылаеться на другую арду и та уже при получении её, инвертирует состояние выхода.

В ИТОГЕ СТРОКА ВКЛЮЧАЕТ И ВЫКЛЮЧАЕТ ЗА РАЗ!!!!!

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <EEPROM.h> // эта библиотека нужна для работы с энерго-независимой памятью
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 100 }; // IP адрес 
EthernetServer server(80);


const int led_pin = 13;
const int transmit_pin = 5; //установка пина, к которому подключен data-вход передатчика
unsigned int unique_device_id = 0;  

int pinState[] = { 0, 0, 0, 0, 0, 0, 0, 0 };  // Состояние пинов

//create object
EasyTransferVirtualWire ET; 

struct SEND_DATA_STRUCTURE{
  //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  unsigned int device_id;
  unsigned int destination_id;    
  unsigned int packet_id;
  byte command;
  int data;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

//ниже пару функций для записи данных типа unsigned int в EEPROM
void EEPROMWriteInt(int p_address, unsigned int p_value)
      {
      byte lowByte = ((p_value >> 0) & 0xFF);
      byte highByte = ((p_value >> 8) & 0xFF);

      EEPROM.write(p_address, lowByte);
      EEPROM.write(p_address + 1, highByte);
      }

unsigned int EEPROMReadInt(int p_address)
      {
      byte lowByte = EEPROM.read(p_address);
      byte highByte = EEPROM.read(p_address + 1);

      return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
      }

void setup()
{
  ET.begin(details(mydata));
  vw_set_tx_pin(transmit_pin);
  vw_set_rx_pin(receive_pin);  
  vw_setup(2000);        //скорость передачи
  Serial.begin(9600);
  randomSeed(analogRead(0));
  Ethernet.begin(mac, ip);
  server.begin();


  // Читаем/записываем Device ID
  Serial.print("Getting Device ID... "); 
  unique_device_id=EEPROMReadInt(0);
  if (unique_device_id<10000 || unique_device_id>60000) {
   Serial.print("N/A, updating... "); 
   unique_device_id=random(10000, 60000);
   EEPROMWriteInt(0, unique_device_id);
  }
  Serial.println(unique_device_id); 
  
  
}

void loop()
{
EthernetClient client = server.available();
  if (client)
  {
    // Проверяем подключен ли клиент к серверу
    while (client.connected())
    {
   // Проверяем идет ли запрос к серверу
      int dataCount = client.available();
      if (dataCount > 0)
      {
        // Считываем данные передаваемые серверу с клиента (броузера)
        for (int i = 0; i < dataCount; i++)
        {
          char ch = client.read();
          // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
          if (i == 0 && ch != 'P')
            break;
          if (ch == '\n' && i < dataCount - 1)
          {
             // Находим строку, в которой содержатся передаваемые данные
             char chNext = client.read();
             // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
             if (chNext == 'r')
             {
               // Выключаем все реле
               pinState[0] = 0;
               pinState[1] = 0;
               pinState[2] = 0;
               pinState[3] = 0;
               pinState[4] = 0;
               pinState[5] = 0;
               pinState[6] = 0;
               pinState[7] = 0;
               // Считываем первый номер реле, который нужно включить
               char relayNum = client.read();
               pinState[relayNum-'0'] = 1;
               Serial.write(relayNum);
               // Считываем вспомогательную информацию (=on&)
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               // Пока есть данные об остальных реле, считываем и заносим в массив pinState
               while (relayNum != -1)
               {
                  relayNum = client.read();
                  relayNum = client.read(); // по логике нужно продублировать
                  pinState[relayNum-'0'] = 1;
                  Serial.write(relayNum);
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
               }
             } else
             {
                // Если не было передано данных, то выключаем все реле
                pinState[0] = 0;
                pinState[1] = 0;
                pinState[2] = 0;
                pinState[3] = 0;
                pinState[4] = 0;
                pinState[5] = 0;
                pinState[6] = 0;
                pinState[7] = 0;
             }
          }
        }
      }
      // В соответствие с переданными данными включаем реле
      int NUM = 0;   
      // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();
      client.println("<html>");
      client.println("<head>");
      client.println("<title>Relay v Garaje + Ethernet shield.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Relay v Garaje + Ethernet shield.</h3>");
      
      client.println("<div>  Light  </div>"); client.print (sensorValue);
      
      client.println("<form method='post'>");
      client.println("<div>Relay 1 <input type='submit' value='  VKL/VKL  ' ");      
      if (pinState[0] == 1){NUM = 1;}
        client.print("checked");
      client.println(" name='r0'></div>");
      client.println("<div>Relay 2 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[1] == 1){NUM = 2;}
        client.print("checked");
      client.println(" name='r1'></div>");
      client.println("<div>Relay 3 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[2] == 1){NUM = 3;}
        client.print("checked");
      client.println(" name='r2'></div>");
      client.println("<div>Relay 4 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[3] == 1){NUM = 4;}
        client.print("checked");
      client.println(" name='r3'></div>");
      client.println("<div>Relay 5 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[4] == 1){NUM = 5;}
        client.print("checked");
      client.println(" name='r4'></div>");
      client.println("<div>Relay 6 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[5] == 1){NUM = 6;}
        client.print("checked");
      client.println(" name='r5'></div>");
      client.println("<div>Освещение <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[6] == 1){NUM = 7;}
       client.print("checked");
      client.println(" name='r6'></div>");
      client.println("<div>Вентиляция <input type='submit' value='  VKL/VKL  ' "); 
      if (pinState[7] == 1){NUM = 8;}
        client.print("checked");
      client.println(" name='r7'></div>"); 
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
  if(NUM !=0) {
  mydata.device_id = unique_device_id;
  mydata.destination_id = 0;
  mydata.packet_id = random(65535);
  mydata.command = 7;
  mydata.data = NUM;

  Serial.print("Transmitting");   
  Serial.print(mydata.packet_id); 
  Serial.print(" device id ");   
  Serial.print(mydata.device_id);   
  Serial.print(" data: "); 
  Serial.print(mydata.data);
  Serial.print(" ... ");
  ET.sendData(); // отправка данных
  Serial.println("DONE");}    
      }
  }
}

вот что пишет сериал монитор при одиночном нажатии сначала одной потом другой кнопки

 

0LLTransmitting23391 device id 47081 data: 1 ... DONE
Transmitting53674 device id 47081 data: 1 ... DONE
1LLTransmitting14375 device id 47081 data: 2 ... DONE
Transmitting46886 device id 47081 data: 2 ... DONE
 
 
1LL  -раньше этого мусора не было
GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

эээээ ото обрезок вот раб вариант... но суть проблемы таже...

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <EEPROM.h> // эта библиотека нужна для работы с энерго-независимой памятью
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 100 }; // IP адрес 
EthernetServer server(80);


const int led_pin = 13;
const int transmit_pin = 5; //установка пина, к которому подключен data-вход передатчика
unsigned int unique_device_id = 0;  

int pinState[] = { 0, 0, 0, 0, 0, 0, 0, 0 };  // Состояние пинов

//create object
EasyTransferVirtualWire ET; 

struct SEND_DATA_STRUCTURE{
  //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  unsigned int device_id;
  unsigned int destination_id;    
  unsigned int packet_id;
  byte command;
  int data;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

//ниже пару функций для записи данных типа unsigned int в EEPROM
void EEPROMWriteInt(int p_address, unsigned int p_value)
      {
      byte lowByte = ((p_value >> 0) & 0xFF);
      byte highByte = ((p_value >> 8) & 0xFF);

      EEPROM.write(p_address, lowByte);
      EEPROM.write(p_address + 1, highByte);
      }

unsigned int EEPROMReadInt(int p_address)
      {
      byte lowByte = EEPROM.read(p_address);
      byte highByte = EEPROM.read(p_address + 1);

      return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
      }

void setup()
{
  ET.begin(details(mydata));
  vw_set_tx_pin(transmit_pin);  
  vw_setup(2000);        //скорость передачи
  Serial.begin(9600);
  randomSeed(analogRead(0));
  Ethernet.begin(mac, ip);
  server.begin();


  // Читаем/записываем Device ID
  Serial.print("Getting Device ID... "); 
  unique_device_id=EEPROMReadInt(0);
  if (unique_device_id<10000 || unique_device_id>60000) {
   Serial.print("N/A, updating... "); 
   unique_device_id=random(10000, 60000);
   EEPROMWriteInt(0, unique_device_id);
  }
  Serial.println(unique_device_id); 
  
  
}

void loop()
{
EthernetClient client = server.available();
  if (client)
  {
    // Проверяем подключен ли клиент к серверу
    while (client.connected())
    {
   // Проверяем идет ли запрос к серверу
      int dataCount = client.available();
      if (dataCount > 0)
      {
        // Считываем данные передаваемые серверу с клиента (броузера)
        for (int i = 0; i < dataCount; i++)
        {
          char ch = client.read();
          // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
          if (i == 0 && ch != 'P')
            break;
          if (ch == '\n' && i < dataCount - 1)
          {
             // Находим строку, в которой содержатся передаваемые данные
             char chNext = client.read();
             // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
             if (chNext == 'r')
             {
               // Выключаем все реле
               pinState[0] = 0;
               pinState[1] = 0;
               pinState[2] = 0;
               pinState[3] = 0;
               pinState[4] = 0;
               pinState[5] = 0;
               pinState[6] = 0;
               pinState[7] = 0;
               // Считываем первый номер реле, который нужно включить
               char relayNum = client.read();
               pinState[relayNum-'0'] = 1;
               Serial.write(relayNum);
               // Считываем вспомогательную информацию (=on&)
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               // Пока есть данные об остальных реле, считываем и заносим в массив pinState
               while (relayNum != -1)
               {
                  relayNum = client.read();
                  relayNum = client.read(); // по логике нужно продублировать
                  pinState[relayNum-'0'] = 1;
                  Serial.write(relayNum);
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
               }
             } else
             {
                // Если не было передано данных, то выключаем все реле
                pinState[0] = 0;
                pinState[1] = 0;
                pinState[2] = 0;
                pinState[3] = 0;
                pinState[4] = 0;
                pinState[5] = 0;
                pinState[6] = 0;
                pinState[7] = 0;
             }
          }
        }
      }
      // В соответствие с переданными данными включаем реле
      int NUM = 0;   
      // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();
      client.println("<html>");
      client.println("<head>");
      client.println("<title>Relay v Garaje + Ethernet shield.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Relay v Garaje + Ethernet shield.</h3>");
      client.println("<form method='post'>");
      client.println("<div>Relay 1 <input type='submit' value='  VKL/VKL  ' ");      
      if (pinState[0] == 1){NUM = 1;}
        client.print("checked");
      client.println(" name='r0'></div>");
      client.println("<div>Relay 2 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[1] == 1){NUM = 2;}
        client.print("checked");
      client.println(" name='r1'></div>");
      client.println("<div>Relay 3 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[2] == 1){NUM = 3;}
        client.print("checked");
      client.println(" name='r2'></div>");
      client.println("<div>Relay 4 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[3] == 1){NUM = 4;}
        client.print("checked");
      client.println(" name='r3'></div>");
      client.println("<div>Relay 5 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[4] == 1){NUM = 5;}
        client.print("checked");
      client.println(" name='r4'></div>");
      client.println("<div>Relay 6 <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[5] == 1){NUM = 6;}
        client.print("checked");
      client.println(" name='r5'></div>");
      client.println("<div>Освещение <input type='submit' value='  VKL/VKL  ' ");
      if (pinState[6] == 1){NUM = 7;}
       client.print("checked");
      client.println(" name='r6'></div>");
      client.println("<div>Вентиляция <input type='submit' value='  VKL/VKL  ' "); 
      if (pinState[7] == 1){NUM = 8;}
        client.print("checked");
      client.println(" name='r7'></div>"); 
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
  if(NUM !=0) {
  mydata.device_id = unique_device_id;
  mydata.destination_id = 0;
  mydata.packet_id = random(65535);
  mydata.command = 7;
  mydata.data = NUM;

  Serial.print("Transmitting");   
  Serial.print(mydata.packet_id); 
  Serial.print(" device id ");   
  Serial.print(mydata.device_id);   
  Serial.print(" data: "); 
  Serial.print(mydata.data);
  Serial.print(" ... ");
  ET.sendData(); // отправка данных
  Serial.println("DONE");}    
      }
  }
}

 

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Так и не разобрался... Читаем книжки дальше...

pastry777
Offline
Зарегистрирован: 16.01.2014

Строка Serial.write(relayNum) бросает в порт номер реле,если находит его в запросе....включите первое реле,выскочмт 0,второе-1,и первое и второе-01 и тд..это точно...а вот с LL затрудняюсь обьяснить...

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

в общем всё решил, проблема была с перегревом, ардуино стояло на работе включено часов 5, пока я работал, а на перерыве был этот глюк.... в общем, оказалось в скейче нет проблем, просто как я понял чип W5100 на шилде сильно греется и начинает глючить сериал порт, не спрашивайте почему и как - я не знаю...

РЕшение: приклеил на термоклей радиатор от охлаждения опер памяти видеокарты и.... ВУАЛЯ всё работает, как минимум 3 суток аптайм и глюков не было, скейч тот-же...

Тема закрыта...