Подскажите в чем дело.
Есть функция генерации меандра.
void loop() {
genSignal(10000, 50, 1000, 50);
}
Еsp32 нормально отрабатывает и выводит меандр (прямоугольные импульсы), когда цифры подставляю напрямую вместо аргументов.
Но, хотелось чтоб в функцию подавались переменные.
Вот так.
void loop() {
genSignal(dutyCycle1, dutyCycle2, dutyCycle3, dutyCycle4);
}
Изменяя переменные, менять форму меандра.
Но когда вставляю вместо цифр переменные (dutyCycle1, dutyCycle2, dutyCycle3, dutyCycle4) в мониторе порта наблюдаю ребутинг в цикле. То есть esp32 постоянно перезагружается.
Теперь собственно сама функция.
Она отрабатывает не нормально, когда ей в качестве аргумента подставляешь переменные (dutyCycle1, dutyCycle2, dutyCycle3, dutyCycle4)
А когда напрямую вставляешь цифры, отрабатывает нормально, получаю меандр, что и хочу .
void genSignal(unsigned long h_Freq, long h_Duty, unsigned long l_Freq, long l_Duty) {
// для высокой частоты
h_Total = k / h_Freq;
h_Ton = h_Duty * h_Total / 100;
h_Tof = h_Total - h_Ton;
// для низкой частоты
l_Total = k / l_Freq;
l_Ton = l_Duty * l_Total / 100;
l_Tof = l_Total - l_Ton;
for (i = 1; i * h_Total < l_Ton; i++) { //сигнал l_Ton
digitalWrite(pinOut, HIGH); //состоящий из пачки
delayMicroseconds(h_Ton); //сигналов h_Ton
digitalWrite(pinOut, LOW);
delayMicroseconds(h_Tof);
}
digitalWrite(pinOut, LOW); //сигнал l_Tof
delayMicroseconds(l_Tof);
В чем дело понять не могу
Собственно весь полный код здесь
#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include "SPIFFS.h"
#include <Arduino_JSON.h>
// Replace with your network credentials
const char* ssid = "*********";
const char* password = "**********";
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
// Create a WebSocket object
AsyncWebSocket ws("/ws");
// Set pinOut GPIO
const int pinOut = 12;
// установка коэффициентов
unsigned int i;
unsigned long k = 1000000; // перевод секунд в микросекунды
String message = "";
String sliderValue1 = "0";
String sliderValue2 = "0";
String sliderValue3 = "0";
String sliderValue4 = "0";
unsigned long dutyCycle1;
int dutyCycle2;
unsigned long dutyCycle3;
int dutyCycle4;
unsigned long h_Freq;
int h_Duty;
unsigned long l_Freq;
int l_Duty;
unsigned long h_Total;
unsigned long h_Ton;
unsigned long h_Tof;
unsigned long l_Total;
unsigned long l_Ton;
unsigned long l_Tof;
//Json Variable to Hold Slider Values
JSONVar sliderValues;
//Get Slider Values
String getSliderValues(){ //создает строку JSON с текущими значенимим сладеров
sliderValues["sliderValue1"] = String(sliderValue1);
sliderValues["sliderValue2"] = String(sliderValue2);
sliderValues["sliderValue3"] = String(sliderValue3);
sliderValues["sliderValue4"] = String(sliderValue4);
String jsonString = JSON.stringify(sliderValues);
return jsonString;
}
// Initialize SPIFFS
void initFS() {
if (!SPIFFS.begin()) {
Serial.println("An error has occurred while mounting SPIFFS");
}
else{
Serial.println("SPIFFS mounted successfully");
}
}
// Initialize WiFi
void initWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println(WiFi.localIP());
}
void notifyClients(String sliderValues) { //уведомляет всех клиентов о текущих значениях ползунков
ws.textAll(sliderValues);
}
void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) { //сервер прослушивает и обрабатывает то что пришло от клиента по протоколу вэбсокет
AwsFrameInfo *info = (AwsFrameInfo*)arg;
if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
data[len] = 0;
message = (char*)data;
if (message.indexOf("1s") >= 0) {
sliderValue1 = message.substring(2);
dutyCycle1 = map(sliderValue1.toInt(), 0, 240000, 0, 240000);
Serial.println(dutyCycle1);
Serial.print(getSliderValues());
notifyClients(getSliderValues());
}
if (message.indexOf("2s") >= 0) {
sliderValue2 = message.substring(2);
dutyCycle2 = map(sliderValue2.toInt(), 0, 100, 0, 100);
Serial.println(dutyCycle2);
Serial.print(getSliderValues());
notifyClients(getSliderValues());
}
if (message.indexOf("3s") >= 0) {
sliderValue3 = message.substring(2);
dutyCycle3 = map(sliderValue3.toInt(), 0, 240000, 0, 240000);
Serial.println(dutyCycle3);
Serial.print(getSliderValues());
notifyClients(getSliderValues());
}
if (message.indexOf("4s") >= 0) {
sliderValue4 = message.substring(2);
dutyCycle4 = map(sliderValue4.toInt(), 0, 100, 0, 100);
Serial.println(dutyCycle4);
Serial.print(getSliderValues());
notifyClients(getSliderValues());
}
if (strcmp((char*)data, "getValues") == 0) { //когда сервер получает getValues сообщение, он отправляет текущие значения ползунка
notifyClients(getSliderValues());
}
}
}
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
switch (type) {
case WS_EVT_CONNECT:
Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
break;
case WS_EVT_DISCONNECT:
Serial.printf("WebSocket client #%u disconnected\n", client->id());
break;
case WS_EVT_DATA:
handleWebSocketMessage(arg, data, len);
break;
case WS_EVT_PONG:
case WS_EVT_ERROR:
break;
}
}
void initWebSocket() {
ws.onEvent(onEvent);
server.addHandler(&ws);
}
void setup() {
Serial.begin(115200);
pinMode(pinOut, OUTPUT);
initFS();
initWiFi();
initWebSocket();
// Web Server Root URL
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/index.html", "text/html");
});
server.serveStatic("/", SPIFFS, "/");
// Start server
server.begin();
}
void loop() {
genSignal(dutyCycle1, dutyCycle2, dutyCycle3, dutyCycle4);
ws.cleanupClients();
}
//Свои функции
void genSignal(unsigned long h_Freq, long h_Duty, unsigned long l_Freq, long l_Duty) {
// для высокой частоты
h_Total = k / h_Freq;
h_Ton = h_Duty * h_Total / 100;
h_Tof = h_Total - h_Ton;
// для низкой частоты
l_Total = k / l_Freq;
l_Ton = l_Duty * l_Total / 100;
l_Tof = l_Total - l_Ton;
for (i = 1; i * h_Total < l_Ton; i++) { //сигнал l_Ton
digitalWrite(pinOut, HIGH); //состоящий из пачки
delayMicroseconds(h_Ton); //сигналов h_Ton
digitalWrite(pinOut, LOW);
delayMicroseconds(h_Tof);
}
digitalWrite(pinOut, LOW); //сигнал l_Tof
delayMicroseconds(l_Tof);
}
Код не мой, мой здесь только последняя функция