Hi,
Using Blynk 1.1.0, Blynk server, Arduino Uno, Mkr Ethernet shield.
A few months ago I had this running and everything worked perfectly. Both communication with app and device behaved exactly as expected. After that I tried another Ethernet shield but ended up using the Mkr shield again. But now, the connection to Blynk server does not work. Somehow it seems to connect and reconnect, sometimes it seems to be connected for a very short while but it simply does not work. Since device can connect to server I think the Ethernet/IP part is ok. Do I have the wrong Blynk version? I can’t see the difference compared to when it worked.
In attached image one can see the periodic connections to server, probably they are symptom of the root cause.
Br Björn
/*************************************************************
Styrning av värmepump
*************************************************************/
#define BLYNK_PRINT Serial
// Blynk-items
#define BLYNK_TEMPLATE_ID "TMPLQsUn1mZj"
#define BLYNK_DEVICE_NAME "Test"
#define BLYNK_AUTH_TOKEN "Dx3UwvsBNKVtv7dFLIYI-3Ec0mV3IOGo"
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
char auth[] = BLYNK_AUTH_TOKEN;
#define SDCARD_CS 4
// Uppstartsfördröjning START_DELAY * 1 s
// Ska sättas till 60 sekunder när systemet är live
// Routern verkar hitta koppling efter cirka 35 sekunder
#define START_DELAY 5
//*************************************************************/
// Används för periodisk koll
BlynkTimer periodicTimer;
// Räknare för antalet checkar mot cloud
// Kör varje minut
// LĂĄt dem nollas vid omstart
unsigned int connected = 0;
unsigned int not_connected = 0;
// Tröskel för låg temperatur
double lowTemp = 10;
// Aktivera autoavstängning vid låg temperatur
boolean activateLow = false;
// Räknare för periodisk timer
int periodicCount = 0;
// Antal minuter (59 sekunder) - periodtid, sätt för att vara under timmen
const int reportPeriod = 1;
// Synkas alltid om
int currentLevel = 0;
// Förra samplet, sätt så att det inte triggar nerstängning
double lastVardagsrum = lowTemp + 1;
double lastHall = lowTemp + 1;
// Virtuella pinnar
// Sätta temperaturnivå : V0
// Visa temperaturnivĂĄ : V1
// Hall : V2
// Utomhus : V3
// Vardagsrum : V4
// Uppkoppling stat. : V5
// Kommer om pinne V0 (slider) ändrats eller om det är synkning. Sätt reläer.
BLYNK_WRITE(V0)
{
currentLevel = param.asInt();
Serial.print("Fick nytt nivåvärde och skickat tillbaka till server: ");
Serial.println(currentLevel);
setLevel(currentLevel);
Blynk.virtualWrite(V1, currentLevel);
}
// Synka värdet från server
BLYNK_CONNECTED()
{
Blynk.syncVirtual(V0);
}
// Kör varje period
void timerHit()
{
//---------------------------------------------------------------------------------
// Kolla om en period gĂĄtt, om inte, hoppa ur
periodicCount++;
if (periodicCount < reportPeriod)
{
return;
}
//---------------------------------------------------------------------------------
Serial.println("Kör periodisk funktion");
// Eftersom en period gått, nolla räknaren
periodicCount = 0;
// Börja om ifall räknarna blivit stora
if ( (connected > 65000) || (not_connected > 65000) )
{
connected = 0;
not_connected = 0;
}
else
{
// Kolla om grejerna är uppe
if (Blynk.connected() == true)
{
++connected;
Serial.println("Connected to server");
}
else
{
++not_connected;
Serial.println("Not connected to server");
}
// Undvik nolldivision samt uppdatera procentandel
int sum = connected+not_connected;
if ( sum != 0 )
{
Blynk.virtualWrite(V5, 100*connected/sum);
}
}
//---------------------------------------------------------------------------------
// Temperaturer, kör tre mätningar per sensor
double tempHall = calcTemperature(analogRead(0),analogRead(0),analogRead(0));
double tempVardagsrum = calcTemperature(analogRead(1),analogRead(1),analogRead(1));
double tempUte = calcTemperature(analogRead(2),analogRead(2),analogRead(2));
// Uppdatera temperaturer till server
Serial.println(tempHall);
Serial.println(tempVardagsrum);
Serial.println(tempUte);
Blynk.virtualWrite(V1, currentLevel);
Blynk.virtualWrite(V2, tempHall);
Blynk.virtualWrite(V3, tempUte);
Blynk.virtualWrite(V4, tempVardagsrum);
// Om senaste och förra mätningen är för låga -> stäng av
if ( ( ( (lastHall < lowTemp) && (tempHall < lowTemp)) || ( (tempVardagsrum < lowTemp) && (tempVardagsrum < lowTemp)) ) && activateLow == true )
{
// Larma bara här
}
lastHall = tempHall;
lastVardagsrum = tempVardagsrum;
}
//---------------------------------------------------------------------------------
void timerHitLed()
{
digitalWrite(5, HIGH);
delay(100);
digitalWrite(5, LOW);
}
void setup()
{
Serial.println("DEBUG: Setup");
// Debug console
Serial.begin(9600);
pinMode(2, OUTPUT); // Relä för level 3
pinMode(3, OUTPUT); // Relä för level 2
pinMode(6, OUTPUT); // Relä för level 1
pinMode(5, OUTPUT); // LED
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
Serial.println("DEBUG: Before init");
Ethernet.init(10); // Pin 10 gĂĄr till pin 5 pĂĄ Mkr shield
delay(1000);
Serial.println("DEBUG: After init");
// Vänta lite, öka chansen att routern vaknat efter strömavbrott
//delay(1000*START_DELAY);
// Authentisera mot cloud
Serial.println("DEBUG: Before begin");
Blynk.begin(auth);
Serial.println("DEBUG: After begin");
// Periodisk funktion, kör varje minut (nästan) för att pusha data
periodicTimer.setInterval(59000L, timerHit);
periodicTimer.setInterval(10000L, timerHitLed);
}
void loop()
{
Blynk.run();
periodicTimer.run();
}
// Gör om mätvärde till temperatur
double calcTemperature(int reading1, int reading2, int reading3)
{
// Medelvärde
int reading = (reading1+reading2+reading3)/3;
double Temp;
Temp = log(10000.0 * ((1024.0 / reading - 1)));
Temp = 1 /(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp)) * Temp);
Temp = Temp - 273.15; // convert from Kelvin to Celsius
return Temp;
}
void setLevel(byte value)
{
// Sätt relä direkt
if (value==4)
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(6,LOW);
}
if (value==3)
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(6,LOW);
}
if (value==2)
{
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(6,LOW);
}
if (value==1)
{
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(6,HIGH);
}
}