Уважаемые гуру, помогите новичку разобраться!

nailsoft
Offline
Зарегистрирован: 23.11.2017

Всем доброго времени суток, заболел идеей сделать удаленный датчик температуры (на данный момент 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();
      
   
      }
    }
  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nailsoft пишет:

укажите новичку (можно в грубой форме) что я делаю неверно ?!?!?

Неверно то, что вместо того, чтобы писать собственный скетч (прочитав книжку по программированию, а не Блюма), Вы пытаетесь "слить" несколько чужих. Это глобальная неправильность, принципиальная. Неправильность в подходе, а не в исполнении.

Тут кто-то из коллег приводил забавную аналогию. Прежде, чем сливать вместе несколько скетчей, подумайте о такой задаче: имеются нормально работающие КАМАЗ, Феррари и Запорожец. Требуется слить их вместе. чтобы получилась машина с грузоподъёмностью КАМАЗа, скоростью Феррари и ценой Запорожца.

Как Вы думаете, получится?

А теперь, можете продолжать сливать скетчи. Или почитать книжку и начинать писать свои.

nailsoft
Offline
Зарегистрирован: 23.11.2017

посоветуйте нормальную книжку, пожалуйста!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уровень? Совсем ничего не знаете или на каком-нибудь бейсике/паскале/ещё там чём что-то писали?

nailsoft
Offline
Зарегистрирован: 23.11.2017

на бейсике в школе, на паскале в училище, на хтмл странички писал.... си и пхп не пошли, показались сложноватыми

nailsoft
Offline
Зарегистрирован: 23.11.2017

начальный уровень....

вообще честно хотелось бы разобраться в конкретных скетчах, просто столько времени провел за ними, уже просто так не отпустит....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тогда начните вот с этого - https://drive.google.com/file/d/0B9r7cRXQ4DU4dTBtRFpub0tfV00/view?usp=sharing

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ватэто:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес

не мак адрес. Это DEADBEEF.

nailsoft
Offline
Зарегистрирован: 23.11.2017

DetSimen пишет:

ватэто:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес

не мак адрес. Это DEADBEEF.

 

Во первых устройство прекрасно работает в сети я же написал! Не работает форма отправки команды блоку реле!

Во вторых не вижу никаких проблем в использовании мака DEADBEEFFEED 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я и не говорил, что из-за этого не работает.  :)  

nailsoft
Offline
Зарегистрирован: 23.11.2017

А ты просто пошутил про мертвое мяясо =)))))

мне тоже понравилось!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

ватэто:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес

не мак адрес. Это DEADBEEF.

Я ещё люблю юзать 

byte mac[] = { 0xAB, 0xBA, 0xDE, 0xAD, 0xBE, 0xEF }; // Мак адрес

В память о смерти одной малоизвестной группы :)

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nailsoft пишет:

получил головную боль в 3 суток...

nailsoft пишет:

 хотелось бы разобраться в конкретных скетчах, просто столько времени провел за ними...

Эти две цитаты кардинально друг с другом не сочетаются. 

Минимум на 2 порядка (т.е. в 100 раз).

sadman41
Offline
Зарегистрирован: 19.10.2016

DIYMan пишет:

Я ещё люблю юзать 

byte mac[] = { 0xAB, 0xBA, 0xDE, 0xAD, 0xBE, 0xEF }; // Мак адрес

В память о смерти одной малоизвестной группы :)

DEADBEEFFEED, кстати, более безопасен, ибо он лежит в диапазоне locally administered MAC addresses.

Ну, это так, просто к слову пришлось.

spst
Offline
Зарегистрирован: 01.12.2017

Доброго времени суток!

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, при попытке компиллировать выдает ошибку: 

"SdFat"  does not name a type
 
Подскажите ,пожалуйста, как запустить этот shield
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

spst, посмотреть, какие подключаются библиотеки, и убедиться в их наличии.

При отсутствии - найти и установить.

spst
Offline
Зарегистрирован: 01.12.2017

 Спасибо за ответ (несмотря на то что,как мне кажется, я влез куда-то не туда( в смысле темы форума)).  :)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Здесь подборка уроков, как простых так и продвинутых с аяксом и без оного. Мне очень помогло.

одна из проб крутится уже года полтора без сбоев и зависаний 

Железо - мега , w5100 с добавленным принудительным ресетом, часы, ds1820, четыре реле, программный эмулятор среды.