Накой хрен там вообще эти недопеременные в каком-то огрызке кода?
вангую…
если строчку “4” убрать, то “21” посинеет
вы идиот, простите?
В сообщении 11 вам был дан четкий рецепт, как именно выяснить, что у вас не работает. Присвойте любое ненулевое значение переменной dutyCycle1 перед вызовом вашей функции и потом проверьте, что напечатает та строка, которую вы говорите что добавили в строку 188.
Неужели это так сложно?
Миссия “Невыполнима” (провалена)
void **loop**() {
dutyCycle1 =10000;
dutyCycle2 = 50;
dutyCycle3 = 1000;
dutyCycle4 = 50;
genSignal(dutyCycle1, dutyCycle2, dutyCycle3, dutyCycle4);
ws.cleanupClients();
}
Попробуйте так. Если заработает, то проблема не в передаче параметров в функцию. Может на вход просто поступают нули?
И сделайте чтоб типы формальных параметров совпадали с фактическими, а то где int, где long… и совпадают ли они в ESP32? не совпадают … правильно ли преобразовываются… Лучше явно и четко типа int32_t
Ему это еще в начале темы сказано было.
Ну теперь уже написано :))) Может это поможет…
Думаешь в начале темы азбукой Морзе было выгравировано?
Пробовал так уже.
Программа не видит что DutyCycle1 глобальные переменные.
Ребята, расходимся - это клиника. До пятницы ещё далеко. Лично я расхожусь.
чудо, ну выложи наконец код (как положено).
и главное результат. если непосредственно перед вызовом присвоить значения, то меандр формируется? или нет.
У него код не компилируется, о каком меандре речь? ))
Вот в таком виде программа уже видит что 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* распознается как глобальная переменная.
Пздц!!!
точно идиот
и чо, заработало? :)))))
И на осциллографе имеем такую картинку
Но проблема не разрешилась, надо выяснить что передается в переменную dutyCycle
Придёцца нанимать часного дефектива.
Код не мой его писал Rui Santos почему он кривой вопросы к нему.
Я его переделываю под генератор меандра. У Руи этот код регулировал ШИМ для светодиодных лампочек.