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

, 👍1

Обсуждение

где он терпит неудачу? ... в вашем скетче нет отладочного кода ... пожалуйста, добавьте код, который печатается на последовательном мониторе, или код, который мигает светодиодом, чтобы вы могли отслеживать ход выполнения вашего кода, @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


2 ответа


0

Я бы начал с того, что сократил его до функций setup() и loop () (без вызова таймера) и установил, подключается ли он, а если нет, то почему бы и нет.
Затем добавьте обратно вызов таймера и очень короткую версию checkSensors () и повторите попытку.
Продолжайте добавлять обратные разделы кода до тех пор, пока он не завершится неудачей.

,

1

Хорошо, я понял это, потому что я использовал контакты 9 и 10, я не знал, что они не могут быть использованы. Спасибо @Juraj!

,