Уважаемые гуру, помогите новичку разобраться!
- Войдите на сайт для отправки комментариев
Всем доброго времени суток, заболел идеей сделать удаленный датчик температуры (на данный момент DHT11 - едет DHT22) и управляемую планку из 4 реле через интернет. Прочитал книгу Изучаем ардуино Джереми Блума, но после прочтения осталось больше вопросов чем ответов, решил искать код по наитию. Воспользовавшьсб гуглом довольно быстро нашел образцы интересующих меня скетчей, а именно:
реле:
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 2, 200 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(80); int numPins = 4; int pins[] = { 4, 5, 6, 7 }; // Пины для реле int pinState[] = {0, 0, 0, 0}; // Состояние пинов void setup() { // Изначально выключаем все реле for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 1); } Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); } 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; // Считываем первый номер реле, который нужно включить 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; } } } } // В соответствие с переданными данными включаем реле for (int i = 0; i < 4; i++) { digitalWrite(pins[i], !pinState[i]); } // Выводим 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>Zelectro. Relay + Ethernet shield.</title>"); client.println("</head>"); client.println("<body>"); client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>"); client.println("<form method='post'>"); client.print("<div>Relay 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></div>"); client.print("<div>Relay 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></div>"); client.print("<div>Relay 3 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></div>"); client.print("<div>Relay 4 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></div>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.stop(); } } }
и датчик температуры
#include <SPI.h> #include <Ethernet.h> #include <dht11.h> #include <Wire.h> #define DHT11PIN 2 // The Temperature/Humidity sensor pin // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,2, 200); // Initialize the Ethernet server library EthernetServer server(80); dht11 DHT11; //The Sensor Object /*-----( Declare Variables )-----*/ void setup() { // Open serial communications Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); } void loop() { // listen for incoming clients EthernetClient client = server.available(); if (client) { Serial.println("new client"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<meta http-equiv=\"refresh\" content=\"5\">"); client.println("<br />"); int chk = DHT11.read(DHT11PIN); Serial.print("Read sensor: "); switch (chk) { case 0: Serial.println("OK"); break; case -1: Serial.println("Checksum error"); break; case -2: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; } client.print("Temperature (C): "); client.println((float)DHT11.temperature, 1); client.println("<br />"); client.print("Humidity (%): "); client.println((float)DHT11.humidity, 0); client.println("<br />"); client.println("</html>"); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); Serial.println("client disonnected"); } }
Каждый скетч по отдельности работает изумительно!!!!
но при попытке сделать из них единую программу получил головную боль в 3 суток.... сплю сниться код, ребенка вчера забыл поцеловать перед сном, работать не могу в голове только код....
СПАСИТЕ ПОМОГИТЕ!!!! ВЕРНИТЕ МЕНЯ К НОРМАЛЬНОЙ ЖИЗНИ ПОЖАЛУЙСТА!!!! =))))
укажите новичку (можно в грубой форме) что я делаю неверно ?!?!?
Вот Скетч который у меня получился в итоге слияния, проверку проходит но работает только датчик DHT11, почему не работают реле понять не могу.... может тупой ((((
#include <SPI.h> #include <Ethernet.h> #include <dht11.h> #include <Wire.h> #define DHT11PIN 2 // The Temperature/Humidity sensor pin byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 2, 200 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(80); int numPins = 4; int pins[] = { 4, 5, 6, 7 }; // Пины для реле int pinState[] = {0, 0, 0, 0}; // Состояние пинов dht11 DHT11; //The Sensor Object #define DHT11PIN 2 // The Temperature/Humidity sensor pin void setup() { // Изначально выключаем все реле for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 1); } Ethernet.begin(mac, ip); server.begin(); } void loop() { // слушаем входящего клиента EthernetClient client = server.available(); if (client) { // Проверяем подключен ли клиент к серверу while (client.connected()) { //********************* int dataCount = client.available(); //int currentLineIsBlank = true; char c = client.read(); Serial.write(c); if (c == '\n' && dataCount) 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; // Считываем первый номер реле, который нужно включить char relayNum = client.read(); pinState[relayNum-'0'] = 1; // Считываем вспомогательную информацию (=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; 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; } } } } // В соответствие с переданными данными включаем реле for (int i = 0; i < 4; i++) { digitalWrite(pins[i], !pinState[i]); } client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("<body>"); client.println("<h4>Relay + Ethernet shield.</h4>"); client.println("<form method='post'>"); client.print("<div>Relay 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></div>"); client.print("<div>Relay 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></div>"); client.print("<div>Relay 3 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></div>"); client.print("<div>Relay 4 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></div>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.println("<!DOCTYPE HTML>"); client.println("<meta http-equiv=\"refresh\" content=\"5\">"); int chk = DHT11.read(DHT11PIN); client.print("Temperature (C): "); client.println((float)DHT11.temperature, 1); client.println("<br />"); client.print("Humidity (%): "); client.println((float)DHT11.humidity, 0); client.println("<br />"); if (c == '\n') { dataCount = true; } else if (c != '\r') { dataCount = false; } client.stop(); } } }
укажите новичку (можно в грубой форме) что я делаю неверно ?!?!?
Неверно то, что вместо того, чтобы писать собственный скетч (прочитав книжку по программированию, а не Блюма), Вы пытаетесь "слить" несколько чужих. Это глобальная неправильность, принципиальная. Неправильность в подходе, а не в исполнении.
Тут кто-то из коллег приводил забавную аналогию. Прежде, чем сливать вместе несколько скетчей, подумайте о такой задаче: имеются нормально работающие КАМАЗ, Феррари и Запорожец. Требуется слить их вместе. чтобы получилась машина с грузоподъёмностью КАМАЗа, скоростью Феррари и ценой Запорожца.
Как Вы думаете, получится?
А теперь, можете продолжать сливать скетчи. Или почитать книжку и начинать писать свои.
посоветуйте нормальную книжку, пожалуйста!
Уровень? Совсем ничего не знаете или на каком-нибудь бейсике/паскале/ещё там чём что-то писали?
на бейсике в школе, на паскале в училище, на хтмл странички писал.... си и пхп не пошли, показались сложноватыми
начальный уровень....
вообще честно хотелось бы разобраться в конкретных скетчах, просто столько времени провел за ними, уже просто так не отпустит....
Тогда начните вот с этого - https://drive.google.com/file/d/0B9r7cRXQ4DU4dTBtRFpub0tfV00/view?usp=sharing
ватэто:
byte
mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Мак адрес
не мак адрес. Это DEADBEEF.
ватэто:
byte
mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Мак адрес
не мак адрес. Это DEADBEEF.
Во первых устройство прекрасно работает в сети я же написал! Не работает форма отправки команды блоку реле!
Во вторых не вижу никаких проблем в использовании мака DEADBEEFFEED
Я и не говорил, что из-за этого не работает. :)
А ты просто пошутил про мертвое мяясо =)))))
мне тоже понравилось!
ватэто:
byte
mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Мак адрес
не мак адрес. Это DEADBEEF.
Я ещё люблю юзать
byte
mac[] = { 0xAB, 0xBA, 0xDE, 0xAD, 0xBE, 0xEF };
// Мак адрес
В память о смерти одной малоизвестной группы :)
хотелось бы разобраться в конкретных скетчах, просто столько времени провел за ними...
Эти две цитаты кардинально друг с другом не сочетаются.
Минимум на 2 порядка (т.е. в 100 раз).
Я ещё люблю юзать
byte
mac[] = { 0xAB, 0xBA, 0xDE, 0xAD, 0xBE, 0xEF };
// Мак адрес
В память о смерти одной малоизвестной группы :)
DEADBEEFFEED, кстати, более безопасен, ибо он лежит в диапазоне locally administered MAC addresses.
Ну, это так, просто к слову пришлось.
Доброго времени суток!
1. Купил на Али "VS1053 shield board MP3 Music shield with TF card slot"
2.Поставил на Arduino Uno.
3.Скачал MP3-TF.zip,распокавал, установил в C:\Users\1\Documents\Arduino\libraries
4.Скачал Arduino IDE 1.0 , распаковал, запустил приложение из папки аrduino -1.0 (до этого пользовался версией arduino-nightly)
5.Открыл пример MP3Shield-Library Demo, при попытке компиллировать выдает ошибку:
spst, посмотреть, какие подключаются библиотеки, и убедиться в их наличии.
При отсутствии - найти и установить.
Спасибо за ответ (несмотря на то что,как мне кажется, я влез куда-то не туда( в смысле темы форума)). :)
Здесь подборка уроков, как простых так и продвинутых с аяксом и без оного. Мне очень помогло.
одна из проб крутится уже года полтора без сбоев и зависаний
Железо - мега , w5100 с добавленным принудительным ресетом, часы, ds1820, четыре реле, программный эмулятор среды.