witty проблемы

bod9I
Offline
Зарегистрирован: 23.04.2016

Не могу запустить сервер по управлению 2 реле.

Скетч делал сам. Не судите строго.

#include <ESP8266WiFi.h>
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11

const char* ssid = "Huawei_HG530";
const char* password = "1233456789";

WiFiServer server(80);

int numPins = 2;
int pins[] = { 14, 15};    // Пины для реле
int pinState[] = {0, 0};  // Состояние пинов

DHT dht(DHTPIN, DHTTYPE);

void setup() {
   for (int i = 0; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 1);
  }
Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  server.begin();
  Serial.print("IP adress: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
    WiFiClient 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.println("<input type='submit' value='Refresh'>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

монитор порта выдает такую картину:помогите сделать чтобы он нормально работал

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

1.
Что значит "нормально работал"? Вы не поверите, но никто кроме Вас не знает, чего Вы хотите от этого кода и в чём разница между тем, что есть и чего Вы хотите. Объясняйте проблему толком.

2.
Текст с монитора копипастите сюда как текст - на картинке его плохо видно.

Araris
Offline
Зарегистрирован: 09.11.2012

3. В тексте скетча не нахожу строк Serial.print("Read "); и Serial.print("failRead ");.

bod9I
Offline
Зарегистрирован: 23.04.2016

Нормально работал - это чтобы он создал страницу и с неё можно было включать и выключать реле.

bod9I
Offline
Зарегистрирован: 23.04.2016

Araris пишет:

3. В тексте скетча не нахожу строк Serial.print("Read "); и Serial.print("failRead ");.


Это вшито в библиотеку

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

bod9I пишет:
Нормально работал - это чтобы он создал страницу и с неё можно было включать и выключать реле.

Да, ну тогда надо его нормально писать.

Что Вы пишете в строке 47? Цикл, который должен отработать столько раз, сколько байтов пришло? А сколько раз Вы в этом цикле читаете по 1 байту? Строки 49, 56, 67, 72, 73, ... в общем 100500 раз. Вы сами-то это странным не находите? Вот в строка 84-87 Вы читаете 4 байта подряд. А Вы уверены, что они уже пришли и ждут Вас? Вы это как-то проверяете?

bod9I
Offline
Зарегистрирован: 23.04.2016

Я взял скетч по которому подключали w5100 и хочу переделать под witty

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

Вы поняли, что я написал? Вы понимаете, что написано в скетче? Или Вы его надеетесь не понимая, методом тыка переделать?

bod9I
Offline
Зарегистрирован: 23.04.2016

Я не могу понять только часть скетча которая связывает witty и страницу (40-100 строка)

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

Перечитайте ещё раз то, что я написал. Постарайтесь понять. Если не понимаете эту часть скетча, выбросьте её и напишите сами.

bod9I
Offline
Зарегистрирован: 23.04.2016

Ок отпишучь о результатах

bod9I
Offline
Зарегистрирован: 23.04.2016

Сделал по другому и на enc28j60, но в ближайшее врему будет и на witty.

вот что получилось:

#include "etherShield.h"
#include "ETHER_28J60.h"
#include <OneWire.h>
#include <DallasTemperature.h>
//---------------------- PIN ETHERNET  ENC28J60--------------
//Ethetnet   Arduino  UNO
//VCC        +3.3V
//GND        GND
//CS(SS)     D10
//SI(MOSI)   D11       
//SO(MISO)   D12
//SCK        D13     
//---------------------- PIN ETHERNET  ENC28J60--------------

int RelPin1 = 3; 
int RelPin2 = 4; 

OneWire oneWire(15); // вход датчиков 18b20 a1
DallasTemperature ds(&oneWire);


DeviceAddress sensor1 = {0x28, 0x00, 0xB7, 0x07, 0x00, 0x00, 0x80, 0x0A};
DeviceAddress sensor2 = {0x28, 0xF4, 0xC5, 0x07, 0x00, 0x00, 0x80, 0x4A};
DeviceAddress sensor3 = {0x28, 0x55, 0xD2, 0x03, 0x00, 0x00, 0x80, 0x02};

static uint8_t mac[6] = {0x54,0x55,0x58,0x10,0x00,0x24}; 
static uint8_t ip[4] = {192,168,1,108};
static uint16_t port = 80; 

ETHER_28J60 ethernet;

void setup() {
  pinMode(RelPin2, OUTPUT);     
  digitalWrite(RelPin2, LOW);
  pinMode(RelPin1, OUTPUT);  
  digitalWrite(RelPin1, LOW);   
    
  ds.begin();
  ethernet.setup(mac, ip, port);

}
void loop() {
String param;
  ds.requestTemperatures();
  if (param = ethernet.serviceRequest())  //Если есть запрос то присвоить значение и выполнить ниже
  {
    if (param == "10")
                         {
                         digitalWrite(RelPin1,HIGH); // Включить 
                         }
    if (param == "11")
                         {
                         digitalWrite(RelPin1,LOW); // Выключить
                         }
    if (param == "20")
                         {
                         digitalWrite(RelPin2,HIGH); // Включить 
                         }
    if (param == "21")
                         {
                         digitalWrite(RelPin2,LOW); // Выключить
                         }
    ethernet.print("<H1>Реле 1</H1>");
    ethernet.print("<table border=\"1\">"); 
    ethernet.print("<tr><td><a href=\"/11\">Реле 1 вкл.</a></td><td><a href=\"/10\">Реле 1 выкл.</a></td>");
    ethernet.print("</table>");
    ethernet.print("<H1>Реле 2</H1>");
    ethernet.print("<table border=\"1\">");     
    ethernet.print("<tr><td><a href=\"/21\">Реле 2 вкл.</a></td><td><a href=\"/20\">Реле 2 выкл.</a></td>");
    ethernet.print("</table>");
    ethernet.print("Температура 1:");
    ethernet.print(ds.getTempC(sensor1));
    ethernet.print("°C; ");
    ethernet.print("Температура 2:");
    ethernet.print(ds.getTempC(sensor2));
    ethernet.print("°C; ");
    ethernet.print("Температура 3:");
    ethernet.print(ds.getTempC(sensor3));
    ethernet.print("°C; ");
ethernet.respond();
  }

}