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

Накой хрен там вообще эти недопеременные в каком-то огрызке кода?

вангую…
если строчку “4” убрать, то “21” посинеет :sweat_smile:

1 лайк

вы идиот, простите?
В сообщении 11 вам был дан четкий рецепт, как именно выяснить, что у вас не работает. Присвойте любое ненулевое значение переменной dutyCycle1 перед вызовом вашей функции и потом проверьте, что напечатает та строка, которую вы говорите что добавили в строку 188.
Неужели это так сложно?

1 лайк

Миссия “Невыполнима” (провалена) :rofl:

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

Попробуйте так. Если заработает, то проблема не в передаче параметров в функцию. Может на вход просто поступают нули?
И сделайте чтоб типы формальных параметров совпадали с фактическими, а то где int, где long… и совпадают ли они в ESP32? не совпадают … правильно ли преобразовываются… Лучше явно и четко типа int32_t

Ему это еще в начале темы сказано было.

Ну теперь уже написано :))) Может это поможет…

Думаешь в начале темы азбукой Морзе было выгравировано?

Пробовал так уже.
Программа не видит что DutyCycle1 глобальные переменные.

Ребята, расходимся - это клиника. До пятницы ещё далеко. Лично я расхожусь.

чудо, ну выложи наконец код (как положено).

1 лайк

и главное результат. если непосредственно перед вызовом присвоить значения, то меандр формируется? или нет.

У него код не компилируется, о каком меандре речь? ))

Вот в таком виде программа уже видит что dutyCycle1, dutyCycle2, dutyCycle3, dutyCycle4 глобальные переменные.


#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;
float k = 1000000;               // перевод секунд в микросекунды 
String message = "";
String sliderValue1 = "1";
String sliderValue2 = "1";
String sliderValue3 = "1";
String sliderValue4 = "1";

unsigned long dutyCycle1;
          int dutyCycle2;
unsigned long dutyCycle3;
          int dutyCycle4;

unsigned long h_Freq;
          int h_Duty;
unsigned long l_Freq;
          int l_Duty;

//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(), 1, 240000, 1, 240000);
      Serial.println(dutyCycle1);
      Serial.print(getSliderValues());
      notifyClients(getSliderValues());
    }
    if (message.indexOf("2s") >= 0) {
      sliderValue2 = message.substring(2);
      dutyCycle2 = map(sliderValue2.toInt(), 1, 100, 1, 100);
      Serial.println(dutyCycle2);
      Serial.print(getSliderValues());
      notifyClients(getSliderValues());
    }    
    if (message.indexOf("3s") >= 0) {
      sliderValue3 = message.substring(2);
      dutyCycle3 = map(sliderValue3.toInt(), 1, 240000, 1, 240000);
      Serial.println(dutyCycle3);
      Serial.print(getSliderValues());
      notifyClients(getSliderValues());
    }
    if (message.indexOf("4s") >= 0) {
      sliderValue4 = message.substring(2);
      dutyCycle4 = map(sliderValue4.toInt(), 1, 100, 1, 100);
      Serial.println(dutyCycle4);
      Serial.print(getSliderValues());
      notifyClients(getSliderValues());
   
    }
    
    if (strcmp((char*)data, "getValues") == 0) {                  //когда сервер получает getValues сообщение, он отправляет текущие значения ползунка
      notifyClients(getSliderValues());
    }
  }
}


void genSignal() {

  h_Freq =dutyCycle1;
  h_Duty = dutyCycle2;
  l_Freq = dutyCycle3;
  l_Duty = dutyCycle4;
  unsigned long h_Total;
  unsigned long h_Ton;
  unsigned long h_Tof;
  unsigned long l_Total;
  unsigned long l_Ton;
  unsigned long l_Tof;
  
  //Serial.println(h_Freq);
  // для высокой частоты
  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);

}

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();
  
  ws.cleanupClients();
}


Переставил функцию выше где dutyCycle* распознается как глобальная переменная.

Пздц!!!

2 лайка

точно идиот

1 лайк

и чо, заработало? :)))))

И на осциллографе имеем такую картинку

Но проблема не разрешилась, надо выяснить что передается в переменную dutyCycle

Придёцца нанимать часного дефектива.

3 лайка

Код не мой его писал Rui Santos почему он кривой вопросы к нему.
Я его переделываю под генератор меандра. У Руи этот код регулировал ШИМ для светодиодных лампочек.