witty проблемы
- Войдите на сайт для отправки комментариев
Чт, 02/02/2017 - 00:37
Не могу запустить сервер по управлению 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();
}
}
}
монитор порта выдает такую картину:
помогите сделать чтобы он нормально работал
1.
Что значит "нормально работал"? Вы не поверите, но никто кроме Вас не знает, чего Вы хотите от этого кода и в чём разница между тем, что есть и чего Вы хотите. Объясняйте проблему толком.
2.
Текст с монитора копипастите сюда как текст - на картинке его плохо видно.
3. В тексте скетча не нахожу строк
Serial.print("Read ");иSerial.print("failRead ");.Нормально работал - это чтобы он создал страницу и с неё можно было включать и выключать реле.
3. В тексте скетча не нахожу строк
Serial.print("Read ");иSerial.print("failRead ");.Это вшито в библиотеку
Да, ну тогда надо его нормально писать.
Что Вы пишете в строке 47? Цикл, который должен отработать столько раз, сколько байтов пришло? А сколько раз Вы в этом цикле читаете по 1 байту? Строки 49, 56, 67, 72, 73, ... в общем 100500 раз. Вы сами-то это странным не находите? Вот в строка 84-87 Вы читаете 4 байта подряд. А Вы уверены, что они уже пришли и ждут Вас? Вы это как-то проверяете?
Я взял скетч по которому подключали w5100 и хочу переделать под witty
Вы поняли, что я написал? Вы понимаете, что написано в скетче? Или Вы его надеетесь не понимая, методом тыка переделать?
Я не могу понять только часть скетча которая связывает witty и страницу (40-100 строка)
Перечитайте ещё раз то, что я написал. Постарайтесь понять. Если не понимаете эту часть скетча, выбросьте её и напишите сами.
Ок отпишучь о результатах
Сделал по другому и на 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(); } }