Официальный сайт компании Arduino по адресу arduino.cc
Ethernet shield + Serial
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 25/12/2014 - 19:44
парни помогите, я не оставил бэкап рабочего скейча и просто допиливал его и подключал модули, и в какойто момент увидел, что веб морда перестала правильно работать... в общем появилась проблема: при нажатии на кнопки в веб морде, ардуино должна была отправить строку в сериал монитор и эфир, а сейчас отправляет 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 -раньше этого мусора не было
эээээ ото обрезок вот раб вариант... но суть проблемы таже...
Так и не разобрался... Читаем книжки дальше...
Строка Serial.write(relayNum) бросает в порт номер реле,если находит его в запросе....включите первое реле,выскочмт 0,второе-1,и первое и второе-01 и тд..это точно...а вот с LL затрудняюсь обьяснить...
в общем всё решил, проблема была с перегревом, ардуино стояло на работе включено часов 5, пока я работал, а на перерыве был этот глюк.... в общем, оказалось в скейче нет проблем, просто как я понял чип W5100 на шилде сильно греется и начинает глючить сериал порт, не спрашивайте почему и как - я не знаю...
РЕшение: приклеил на термоклей радиатор от охлаждения опер памяти видеокарты и.... ВУАЛЯ всё работает, как минимум 3 суток аптайм и глюков не было, скейч тот-же...
Тема закрыта...