Функция не принимает переменные, уходит в reboot

Подскажите в чем дело.
Есть функция генерации меандра.

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);

}

Код не мой, мой здесь только последняя функция

Для начала я бы типы переменных привел в соответствие. А там будем поглядеть.

Так long или int ???

1 лайк

На ноль-то уже разрешено делить?

2 лайка

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

Пока же поставьте в районе строки №188 Вывод в Serial значений переменных h_Freq и h_Freq и покажите нам чему они равны.

Проблема с ребутингом решилась. Все верно делить на ноль нельзя. Переделал функцию.
Но опять таки функция не принимает значение переменной.

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

Вам лень это сделать?

Тогда разбирайтесь сами!

Все по порядку. Слона едим по частям. Решили одну проблему приступаем к другой.

Вы не делаете что Вам говорят, так что … приступайте, в общем …

Вставил в строку 188
Serial.println(h_Freq);
В мониторе порта получил цикл из нулей.

Как и говорил функция не получает на вход значение переменных

добавьте строчку в loop

void loop() {
  dutyCycle1 = 1000;
  genSignal(dutyCycle1, dutyCycle2, dutyCycle3, dutyCycle4);
  
  ws.cleanupClients();
}

и посмотрите что будет печатать в Сериал сейчас

похоже поймал топор…

Никому неизвестно что и куда Вы вставили (доверие к Вашему умению что-то вставлять - отрицательное). Если хотите разговора, публикуйте коды и копипасты монитора порта.

Если там и впрямь нули, значит Вы нули и передаёте.

похоже поймал топор…
Что значить поймал топор?

Вы бы не спрашивали, а делали, что Вам говорят.

Впрочем, если Вы сюда потрыднеть пришли, спрашивайте, не возражаю.

Перед функцией onEvent() строка №4 dutyCycle1 окрашена в синий цвет
А после функции onEvent() строка №21 dutyCycle1 окрашена в белый цвет
Из чего делаю вывод что в последнем случае переменная не распознается как глобальная.
Соответственно ничего не подставляется.

Делайте на здоровье, нам-то Вы зачем об этом сообщаете? Вам сказали, что сделать - Вы игнорируете, так и разбирайтесь сами, без нас.

Код нужно вставлять весь и текстом !!!

она накалилась от ненависти к тому кто ее там разместил.

2 лайка

Надо её (функцию) в угол поставить на горох !!! Ишь распоясалась …