Можно ли добавить кнопки?

junior_developer
Offline
Зарегистрирован: 27.11.2017
Хочу доработать скетч бегущей строки на ESP8266,
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#include <SPI.h>

// эти две библиотеки нужно скачать под роликом иначе кирилица работать не будет.
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

/// подкючение матрицы
// VCC - 5V
// GND - GND :)
// DIN - IO13 - d7
// CS - IO15 - d8 (можно переназначить)
// CLK - IO14 - d5


const char* ssid = "drevo";
const char* pwd = "vika99999"; // пароль для WiFi точки

ESP8266WebServer server(80);  // 192.168.4.1

// количество и подключение матриц, в моем случае матриы подключены в 4 строки по 1 в каждой строке... видимо под иероглифы
Max72xxPanel matrix = Max72xxPanel(15, 1, 4);// тут можно переназначить CS, в данный момент  - io15

unsigned long ticker_next;
String tape = "z";
int spacer = 1;
int width = 5 + spacer;

const char page[] =
  "<html>"
  "<meta charset=\"utf-8\">"
  "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
  "<title>Ticker control</title>"
  "<body>"
  "<form action=\"\" method=\"post\">"
  "<input type=\"text\" name=\"text\"/>"
  "<input type=\"submit\" value=\"Set text\">"
  "</form>"
  "</body>"
  "</html>";

String utf8rus(String source){
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
 
  k = source.length(); i = 0;
  while (i < k) { n = source[i]; i++; if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
        }
      }
    } // switch
    m[0] = n; target = target + String(m);
  }
  return target;
}

void handleSubmit() {
  tape = utf8rus(server.arg("text"));
  server.send(200, "text/html", page);
}

void handleRoot() {
  if (server.hasArg("text")) {
    handleSubmit();
  } else {
    server.send(200, "text/html", page);
  }
}

void setup(void) {
  tape = utf8rus("я");// текст по деволту

  delay(1000);
  WiFi.softAP(ssid, pwd);

  server.on("/", handleRoot);
  server.begin();

  matrix.setIntensity(7); // яркость матрицы от 0 до 15
  matrix.setRotation(matrix.getRotation()+1); // направление движения. 1 - 90 2 - 180 3 - 270
}

void handleTicker() {
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {
    matrix.fillScreen(LOW);

    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
        server.handleClient();
      }

      letter--;
      x -= width;
    }

    matrix.write();
    delay(50);
  }
}

void loop(void) {
  server.handleClient();
  handleTicker();
}

чтобы в нем менялись значения (скорость и яркость)

Рассматривая несколько вариантов:
1. Через интерфейс на той же странице с использованием ползунков.
2. Кнопок +/- 
3. Обычных кнопок, припаянных к выводам.
Константы, которые нужно заменить переменными, я уже нашел!
Для яркости 
matrix.setIntensity(7); // яркость матрицы от 0 до 15
Для скорости (время задержки)
matrix.write();
delay(50); // задержка
uint8_t light=5; // яркость матрицы от 0 до 15
matrix.setIntensity(light);
uint16_t interval=50; // задержка
delay(interval); 

Функции для изменения уже написал

uint8_t changeLight{ // для яркости
	if (light > 1 && light < 16) { // ограничение 
	  if (button1)light++; 
	  if (button2)light--;
	}
	return light;
}

uint16_t changeSpeed(){ // для скорости
	if (interval > 20 && interval < 100) { // ограничение 
	  if (button3)interval+=10; 
	  if (button4)interval-=10;
	}
	return interval;
}

Помогите пожалуйста разобраться, как их "прикрутить"? 
 

 

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

И что мешает вставить их в цикл loop()?

junior_developer
Offline
Зарегистрирован: 27.11.2017

Там всего одна кнопка "Set text". Работает она с формой отправки запроса методом POST? Я правильно понял?


"<form action=\"\" method=\"post\">"
  "<input type=\"text\" name=\"text\"/>"
  "<input type=\"submit\" value=\"Set text\">"

а вот функции
 

void handleSubmit() {
  tape = utf8rus(server.arg("text"));
  server.send(200, "text/html", page);
}

void handleRoot() {
  if (server.hasArg("text")) {
    handleSubmit();
  } else {
    server.send(200, "text/html", page);
  }
}

Если сервер получил аргумент "text", выполняется преобразование текста и он присваивается переменной "tape"?
Наверно вызов функций изменения яркости и скорости нужно тоже запихнуть в handleRoot() ? Или нет?

FoxJone
Offline
Зарегистрирован: 19.04.2019

Я думаю, что кнопки добавить можно...

Но лучше у Клапауция спросить.

Клапауций 9999
Offline
Зарегистрирован: 27.11.2020

junior_developer
Offline
Зарегистрирован: 27.11.2017

Наконец-то добавил кнопки! Работает, так как и хотел!

Кому интересно, можете оценить код:
 

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#include <SPI.h>

// эти две библиотеки нужно скачать под роликом иначе кирилица работать не будет.
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

/// подкючение матрицы
// VCC - 5V
// GND - GND :)
// DIN - IO13 - d7
// CS - IO15 - d8 (можно переназначить)
// CLK - IO14 - d5
int interval = 50;
int light = 5; //яркость матрицы по умолчанию
const char* ssid = "esp";
const char* pwd = "12344321"; // пароль для WiFi точки

ESP8266WebServer server(80);  // 192.168.4.1

// количество и подключение матриц, в моем случае матриы подключены в 4 строки по 1 в каждой строке... видимо под иероглифы
Max72xxPanel matrix = Max72xxPanel(15, 1, 4);// тут можно переназначить CS, в данный момент  - io15

unsigned long ticker_next;
String tape = "z";
int spacer = 1;
int width = 5 + spacer;

const char page[] =
  "<html>"
  "<meta charset=\"utf-8\">"
  "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
  "<title>Ticker control</title>"
  "<body>"
  "<form action=\"\" method=\"post\">"
  "<input type=\"text\" name=\"text\"/>"
  "<input type=\"submit\" value=\"Set text\">"
  "</form>"
  "<form action=\"\" method=\"post\">"
  "<input type=\"submit\" name=\"lightPlus\" value=\"Light++\">"
  "</form>"
  "<form action=\"\" method=\"post\">"
  "<input type=\"submit\" name=\"lightMinus\" value=\"Light--\">"
  "</form>"
  "<form action=\"\" method=\"post\">"
  "<input type=\"submit\" name=\"speedPlus\" value=\"Speed++\">"
  "</form>"
  "<form action=\"\" method=\"post\">"
  "<input type=\"submit\" name=\"speedMinus\" value=\"Speed--\">"
  "</form>"
  "</body>"
  "</html>";

String utf8rus(String source) {
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++; if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break;
        } case 0xD1: {
            n = source[i]; i++; if (n == 0x91) {
              n = 0xB7;
              break;
            } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    } // switch
    m[0] = n; target = target + String(m);
  }
  return target;
}

void handleSubmit() {
  tape = utf8rus(server.arg("text"));
  server.send(200, "text/html", page);
}

void light_Plus() {
  if (light < 15) light++; //ограничение яркости
  else light = 15;      //  максимум до 15
Serial.println(light);
//  server.send(200, "text/html", page);
  matrix.setIntensity(light);// вставить функцию;
}
void light_Minus() {
  if (light > 2) light--; //ограничение яркости
  else light = 1;      // минимум до 1
  Serial.println(light);
//  server.send(200, "text/html", page);
  matrix.setIntensity(light);// вставить функцию;
}
void speed_Plus(){
if (interval > 10) interval-=10;
else interval = 10;
Serial.println(interval);
//server.send(200, "text/html", page);
}
void speed_Minus(){
if (interval < 100) interval+=10;
else interval = 100;
Serial.println(interval);
//server.send(200, "text/html", page);
}

void handleRoot() {
  if (server.hasArg("text")) {
    handleSubmit();
  }
  else if (server.hasArg("lightPlus")) {
    light_Plus();
    server.send(200, "text/html", page);
  }
  else if (server.hasArg("lightMinus")) {
    light_Minus();
    server.send(200, "text/html", page);
  }
  else if (server.hasArg("speedMinus")) {
    speed_Minus();
    server.send(200, "text/html", page);
  }
  else if (server.hasArg("speedPlus")) {
    speed_Plus();
    server.send(200, "text/html", page);
  }
  else {
    server.send(200, "text/html", page);
  }
}

void setup(void) {
  tape = utf8rus("тест");// текст по дефолту
  Serial.begin(115200);
  delay(1000);
  WiFi.softAP(ssid, pwd);

  server.on("/", handleRoot);
  server.begin();
  matrix.setIntensity(7); // яркость матрицы от 0 до 15
  matrix.setRotation(matrix.getRotation() + 1); // направление движения. 1 - 90 2 - 180 3 - 270
}

void handleTicker() {
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {
    matrix.fillScreen(LOW);

    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
        server.handleClient();
      }

      letter--;
      x -= width;
    }

    matrix.write();
    delay(interval);
  }
}

void loop(void) {
  server.handleClient();
  handleTicker();
  Serial.println(light);
  Serial.println(interval);
}

Спасибо всем, кто помог!