NodeMCU не подключается к Blynk
Мой NodeMCU не подключается к Blynk с моим кодом, но отлично работает с примером кода и тем же токеном аутентификации и информацией WiFi. Не могу понять, почему это не работает. Должно быть, что-то в моем коде мешает этому (или что-то глупое, что я упускаю). Есть идеи? Спасибо!
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// Вы должны получить токен аутентификации в приложении Blynk.
// Перейдите в Настройки проекта (значок гайки).
char auth[] = "AUTH";
// Ваши учетные данные Wi-Fi.
// Установите пароль на "" для открытых сетей.
char ssid[] = "SSID";
char pass[] = "PASSWD";
const int analogPin = A0;
const int muxA = 9;// Вывод MUX A
const int muxB = 10;//вывод MUX B
const int muxC = 16;//вывод MUX C
const int outputPin0 = 4;// выходной вывод 0
const int outputPin1 = 5;// output pin 1
const int outputPin2 = 12;//Выходной вывод 2
const int outputPin3 = 13;//выходной вывод 3
const int outputPin4 = 14;//выходной вывод 4
int startWatering0 = 1023;//начальное значение полива 0
int startWatering1 = 1023;//начальное значение полива 1
int startWatering2 = 1023;//начальное значение полива 2
int startWatering3 = 1023;//начальное значение полива 3
int startWatering4 = 1023;//начальное значение полива 4
int currentMoisture0 = 0;//текущее значение влажности 0
int currentMoisture1 = 0;//текущее значение влажности 1
int currentMoisture2 = 0;//текущее значение влажности 2
int currentMoisture3 = 0;//текущее значение влажности 3
int currentMoisture4 = 0;//текущее значение влажности 4
int wateringTime0 = 0;//время полива 0
int wateringTime1 = 0;//время полива 1
int wateringTime2 = 0;//время полива 2
int wateringTime3 = 0;//время полива 3
int wateringTime4 = 0;//время полива 4
bool isWatering0 = false;//is 0 текущий полив
bool isWatering1 = false;//is 1 текущий полив
bool isWatering2 = false;//is 2 текущий полив
bool isWatering3 = false;//is 3 текущий полив
bool isWatering4 = false;//is 4 текущий полив
long wateringStart0 = 0;//полив 0 начальное значение
long wateringStart1 = 0;//полив 1 начальное значение
long wateringStart2 = 0;//полив 2 начальное значение
long wateringStart3 = 0;//полив 3 начальное значение
long wateringStart4 = 0;//полив 4 начальное значение
BlynkTimer timer;
void setup()
{
//инициализация выходов
pinMode(muxA, OUTPUT);
pinMode(muxB, OUTPUT);
pinMode(muxC, OUTPUT);
pinMode(outputPin0, OUTPUT);
pinMode(outputPin1, OUTPUT);
pinMode(outputPin2, OUTPUT);
pinMode(outputPin3, OUTPUT);
pinMode(outputPin4, OUTPUT);
Blynk.begin(auth, ssid, pass);
// Вы также можете указать сервер:
//Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
timer.setInterval(1000L, checkSensors);
}
void checkSensors()
{
//проверьте датчики здесь
setMux0();
currentMoisture0 = analogRead(analogPin);
setMux1();
currentMoisture1 = analogRead(analogPin);
setMux2();
currentMoisture2 = analogRead(analogPin);
setMux3();
currentMoisture3 = analogRead(analogPin);
setMux4();
currentMoisture4 = analogRead(analogPin);
setMux5();
setMux6();
setMux7();
Blynk.virtualWrite(V11, currentMoisture0);
Blynk.virtualWrite(V12, currentMoisture1);
Blynk.virtualWrite(V13, currentMoisture2);
Blynk.virtualWrite(V14, currentMoisture3);
Blynk.virtualWrite(V15, currentMoisture4);
//начинает полив, если почва более сухая, чем заданное значение, и если она еще не поливается
if(currentMoisture0 >= startWatering0 && isWatering0 == false)
{
isWatering0 = true;
digitalWrite(outputPin0, HIGH);
wateringStart0 = millis();
}
if(currentMoisture1 >= startWatering1 && isWatering1 == false)
{
isWatering1 = true;
digitalWrite(outputPin1, HIGH);
wateringStart1 = millis();
}
if(currentMoisture2 >= startWatering2 && isWatering3 == false)
{
isWatering2 = true;
digitalWrite(outputPin2, HIGH);
wateringStart2 = millis();
}
if(currentMoisture3 >= startWatering3 && isWatering3 == false)
{
isWatering3 = true;
digitalWrite(outputPin3, HIGH);
wateringStart3 = millis();
}
if(currentMoisture4 >= startWatering4 && isWatering4 == false)
{
isWatering4 = true;
digitalWrite(outputPin4, HIGH);
wateringStart4 = millis();
}
///////////////////////////////////////////////////////////////////////////////////
//прекращает полив, если в данный момент он поливает, а полив длится дольше установленного времени
if(millis() >= wateringStart0 + (wateringTime0 * 60000 ) && isWatering0 == true)
{
isWatering0 = false;
digitalWrite(outputPin0, LOW);
}
if(millis() >= wateringStart1 + (wateringTime1 * 60000 ) && isWatering1 == true)
{
isWatering1 = false;
digitalWrite(outputPin1, LOW);
}
if(millis() >= wateringStart2 + (wateringTime2 * 60000 ) && isWatering2 == true)
{
isWatering2 = false;
digitalWrite(outputPin2, LOW);
}
if(millis() >= wateringStart3 + (wateringTime3 * 60000 ) && isWatering3 == true)
{
isWatering3 = false;
digitalWrite(outputPin3, LOW);
}
if(millis() >= wateringStart4 + (wateringTime4 * 60000 ) && isWatering4 == true)
{
isWatering4 = false;
digitalWrite(outputPin4, LOW);
}
}
void setMux0()//устанавливает mux на вывод 0
{
digitalWrite(muxA, LOW);
digitalWrite(muxB, LOW);
digitalWrite(muxC, LOW);
}
void setMux1()//устанавливает mux на вывод 1
{
digitalWrite(muxA, HIGH);
digitalWrite(muxB, LOW);
digitalWrite(muxC, LOW);
}
void setMux2()//устанавливает mux на вывод 2
{
digitalWrite(muxA, LOW);
digitalWrite(muxB, HIGH);
digitalWrite(muxC, LOW);
}
void setMux3()//устанавливает mux на вывод 3
{
digitalWrite(muxA, HIGH);
digitalWrite(muxB, HIGH);
digitalWrite(muxC, LOW);
}
void setMux4()//устанавливает mux на вывод 4
{
digitalWrite(muxA, LOW);
digitalWrite(muxB, LOW);
digitalWrite(muxC, HIGH);
}
void setMux5()//устанавливает mux на вывод 5
{
digitalWrite(muxA, HIGH);
digitalWrite(muxB, LOW);
digitalWrite(muxC, HIGH);
}
void setMux6()//устанавливает mux на вывод 6
{
digitalWrite(muxA, LOW);
digitalWrite(muxB, HIGH);
digitalWrite(muxC, HIGH);
}
void setMux7()//устанавливает mux на вывод 7
{
digitalWrite(muxA, HIGH);
digitalWrite(muxB, HIGH);
digitalWrite(muxC, HIGH);
}
//устанавливает значения при их изменении в приложении
//начальные значения полива
BLYNK_WRITE(V1)
{
int startWatering0 = param.asInt();
}
BLYNK_WRITE(V2)
{
int startWatering1 = param.asInt();
}
BLYNK_WRITE(V3)
{
int startWatering2 = param.asInt();
}
BLYNK_WRITE(V4)
{
int startWatering3 = param.asInt();
}
BLYNK_WRITE(V5)
{
int startWatering4 = param.asInt();
}
//значения времени полива
BLYNK_WRITE(V6)
{
int wateringTime0 = param.asInt();
}
BLYNK_WRITE(V7)
{
int wateringTime1 = param.asInt();
}
BLYNK_WRITE(V8)
{
int wateringTime2 = param.asInt();
}
BLYNK_WRITE(V9)
{
int wateringTime3 = param.asInt();
}
BLYNK_WRITE(V10)
{
int wateringTime4 = param.asInt();
}
void loop()
{
Blynk.run();
timer.run();
}
@Randomaker, 👍1
Обсуждение2 ответа
Я бы начал с того, что сократил его до функций setup() и loop () (без вызова таймера) и установил, подключается ли он, а если нет, то почему бы и нет.
Затем добавьте обратно вызов таймера и очень короткую версию checkSensors () и повторите попытку.
Продолжайте добавлять обратные разделы кода до тех пор, пока он не завершится неудачей.
Хорошо, я понял это, потому что я использовал контакты 9 и 10, я не знал, что они не могут быть использованы. Спасибо @Juraj!
- Как переопределить автоматическое управление в приложении Blynk?
- Проблема с датчиком температуры и влажности DHT11
- Получение ошибки ets 8 января 2013,rst cause:4,boot mode(1,6) wdt reset
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Почему dtostrf() не работает для этого значения?
где он терпит неудачу? ... в вашем скетче нет отладочного кода ... пожалуйста, добавьте код, который печатается на последовательном мониторе, или код, который мигает светодиодом, чтобы вы могли отслеживать ход выполнения вашего кода, @jsotola
В общем, не стоит публиковать фактические токены аутентификации или пароли., @Dave Newton
Я немного потерялся с этим кодом-например,
BLYNK_WRITE(V10)
создает локальныйwateringTime4
и немедленно возвращается, выбрасывая его. Я не думаю, что вы намеревались создать там локальную переменную. Возможно, он также должен быть "изменчивым", я не помню., @Dave NewtonТангенциально связанные, но код мог бы быть немного легче рассуждать, если бы некоторые из этих данных были инкапсулированы и помещены в массив или что-то в этом роде., @Dave Newton
вы смело используете выводы 9 и 10. У вас есть DOUT в качестве режима вспышки?, @Juraj
@DaveNewton Упс, я хотел их изменить... Да, вы правы, я не хотел создавать эту переменную, она уже была создана выше, так что она может пытаться создать int, который уже создан, вызывая ошибку или что-то в этом роде. Я исправлю это и посмотрю, сработает ли оно., @Randomaker
Он застревает при инициализации вывода, но каждый раз застревает на разных, иногда на 9, или на 10, или на 13, и даже на 4 один раз., @Randomaker
Хорошо, я понял, что это проблема с инициализацией контакта 9 (mux A), и это дает следующую ошибку-
`ets Jan 8 2013,первая причина:4, режим загрузки:(3,6) wdt сброс нагрузки 0x4010f000, len 3584, номер 16 хвост 0 chksum 0xb0 csum 0xb0 v2843a5ac ~лд
`, @Randomaker