Data se na thingspeak přestanou posílat

Odpovědět
RDVanek
Příspěvky: 20
Registrován: 17 srp 2018, 10:36
Reputation: 0

Data se na thingspeak přestanou posílat

Příspěvek od RDVanek » 15 črc 2020, 10:42

Ahoj,
měřím si teplotu vody v zásobníku na teplou vodu a jednou za 15 min data posílám na thingspeak.com.
Čas od času se data přestanou odesílat, pomůže zmáčknout RESET tlačítko a vše již běží.

Dá se nějak provádět RESET pomocí SW? Nejlépe tehdy, pokud ARDUINO zjistí, že data neodešly, tedy jestli to ARDUINO umí zjistit.

Používám UNO + Ethernet Shield W5100

Díky

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Data se na thingspeak přestanou posílat

Příspěvek od martinius96 » 15 črc 2020, 11:36

Arduino s Ethernet shieldom Wiznet W5100 používa funkciu

Kód: Vybrat vše

client.connect(URL, port)
pre pripojenie na vzdialenú lokalitu. Funkcia vracia true / false.
Preto sa používa takto...

Kód: Vybrat vše

  if (client.connect(server, 80)) {
    //SOM PRIPOJENY, UROBIM REQUEST
  } else {
    Serial.println("Pripojenie sa nepodarilo");
  }
Ak sa pripojenie nepodarí, je tam možné zavolať funkciu, ktorá vykoná reset, či skôr... spustí program odznova a to cez asm inštrukciu jmp.
Znova ti prebehne setup() atď..

Kód: Vybrat vše

void software_Reset(){
	asm volatile ("  jmp 0"); 
}
Táto funkcia sa zavolá v else... pôvodného príkladu.

Avšak, ak sa ti Arduino zasekne fyzicky - "vytuhne" - (že nedôjde ani k tomu, aby sa skúšalo pripájať), nebude to fungovať. Môžeš si do programu doplniť aj watchdog timer, ktorý je možné nastaviť maximálne na 8 sekúnd, alebo sú tam aj úrovne v ms (15MS a pod..). Ak používaš delay, nemôžeš to presiahnuť, lebo sa ti Arduino zresetuje watchdogom. V loope je nutné watchdog nulovať.
Celkom dobre je watchdog popísaný tu: https://create.arduino.cc/projecthub/ra ... mer-fffe20

RDVanek
Příspěvky: 20
Registrován: 17 srp 2018, 10:36
Reputation: 0

Re: Data se na thingspeak přestanou posílat

Příspěvek od RDVanek » 15 črc 2020, 13:43

Díky, zkusím asm instrukci jmp

V Else jsem zvedal failedCounter ++ a pak měl
if (failedCounter > 3 ) {startEthernet();}

Takže se, podle mě, měl po 3 neúspěších restartovat Ethernet
void startEthernet()
{
client.stop();
Serial.println("Connecting Arduino to network...");
Serial.println();
delay(1000);
// Connect to network amd obtain an IP address using DHCP
if (Ethernet.begin(mac) == 0)
{
Serial.println("DHCP Failed, reset Arduino to try again");
Serial.println();
}
else
{
Serial.println("Arduino connected to network using DHCP");
Serial.println();
}
delay(1000);
}

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Data se na thingspeak přestanou posílat

Příspěvek od martinius96 » 15 črc 2020, 15:32

K tej podmienke

Kód: Vybrat vše

if (Ethernet.begin(mac) == 0)
{
by som mal výhrady... Práve pred pár dňami ma to celkom dostalo.
Arduino IDE ktoré som nainštaloval pred 2 rokmi pracovalo s touto podmienkou super... Avšak pri novom update prestalo prostredie Arduino IDE fungovať, nedalo sa spustiť.. Tak som ho nakoniec musel preinštalovať celé a zmenila sa zrejme verzia hlavičkového súboru Ethernet.h, ktorý sa v prostredí nachádzal.

Ak to používam takto:

Kód: Vybrat vše

if (Ethernet.begin(mac) == 0)
{
 Ethernet.begin(mac);
 //pripadne takto
 //Ethernet.begin(mac,ip);
}
tak mi DHCP tú adresu nepridelí, ani mi to nevráti false, skrátka tam Arduino ostane stáť, ako keby tam bol return, alebo while(1) a nič sa nedeje..

Ak to zavolám priamo bez tej podmienky...

Kód: Vybrat vše

Ethernet.begin(mac);
 //pripadne takto
 //Ethernet.begin(mac,ip);
Tak to funguje dobre. Trochu na ten problém poukazuje aj dokumentácia na Arduino.cc
Obrázek
Obrázek

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Data se na thingspeak přestanou posílat

Příspěvek od pavel1tu » 16 črc 2020, 09:15

Pokud nefunguje kod, bývá dobrým zvykem ho sem vložit, nejlépe celý,
zásadně pomocí tlačítek </>

Ona to může být i maličkost se kterou se již někdo potýkal.

1) začínat funkci "Start ethernet" příkazem ClientStop je divné
2) pokud na konci kodu s odesíláním máš ClientStop - dej před něj nějaký delay, mne se osvědčilo 250-750ms, ničemu to nevadí. Někdy prostě protistrana nestihne dost rychle zpracovat odpověď pro tebe a ty to utneš.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

RDVanek
Příspěvky: 20
Registrován: 17 srp 2018, 10:36
Reputation: 0

Re: Data se na thingspeak přestanou posílat

Příspěvek od RDVanek » 16 črc 2020, 10:47

OK, zde je kod.
Obě změny, jak nový start ETHERNET, tak RESET Arduina jsem ještě nezkoušel nasadit

Kód: Vybrat vše

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
 
// Local Network Settings
byte mac[] = { 0xD4, 0x28, 0xB2, 0xFF, 0xD5, 0x63 }; // Must be unique on local network
 
// ThingSpeak Settings
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "xxxxxxxxxxxxx";  
 
long updateThingSpeakInterval = 0;      // Time interval in seconds to update ThingSpeak (number of seconds * 1000 = interval)
 
// Variable Setup
long lastConnectionTime = 0;
boolean lastConnected = false;
int failedCounter = 0;
 
// Initialize Arduino Ethernet Client
EthernetClient client;

#define pin 3
// nastavení komunikace senzoru teploty přes pin
OneWire oneWire(pin);     
DallasTemperature sensors(&oneWire);           
 
unsigned int localPort = 8888;       // local port to listen for UDP packets
const char timeServer[] = "time.nist.gov"; // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
 
void setup()
{
  // Start Serial for debugging on the Serial Monitor
  Serial.begin(9600);
  
 
  // Start Ethernet on Arduino
  startEthernet1();   //Změna pro DHCP
  sensors.begin();
  Udp.begin(localPort);
  // print your local IP address:
  Serial.print("----------------------------- My IP address: ");
  Serial.println(Ethernet.localIP());

}
 
void loop(void)
{
  // Print Update Response to Serial Monitor
  if (client.available())
  {
    char c = client.read();
  }
 
  // Disconnect from ThingSpeak
  if (!client.connected() && lastConnected)
  {
    Serial.println("...disconnected");
    Serial.println();
   
    client.stop();
  }
 
  //******************
  //Print Temperatures
  //******************
  sensors.requestTemperatures();
  float RT = sensors.getTempCByIndex(0);    //float = xx,xx ; int = xx
  float YT = sensors.getTempCByIndex(1);    //float = xx,xx ; int = xx
  
  
  // Update ThingSpeak
  if(!client.connected() && ((millis() - lastConnectionTime)/1000 > updateThingSpeakInterval))
  {
  updateThingSpeak("field1="+String(RT, DEC)+"&field2="+String(YT, DEC));

  // NTP START
  sendNTPpacket(timeServer); // send an NTP packet to a time server
  delay(1000);
  if (Udp.parsePacket()) {
    // We've received a packet, read the data from it
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
 
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    const unsigned long seventyYears = 2208988800UL;
    unsigned long epoch = secsSince1900 - seventyYears;
    Serial.print("Time ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print(epoch % 60); // print the second
  }
  // NTP konec
  Serial.print(" Update ThingSpeak ");
  Serial.print(" IN  : ");
  Serial.print(RT);
  Serial.print(" OUT : ");
  Serial.println(YT);
  updateThingSpeakInterval = 60*15 ; // Time interval in seconds to update ThingSpeak (number of seconds * 1000 = interval)
  }
  // Check if Arduino Ethernet needs to be restarted
  if (failedCounter > 3 ) {startEthernet1();}
 
  lastConnected = client.connected();
}
 
void updateThingSpeak(String tsData)
{
  if (client.connect(thingSpeakAddress, 80))
  {        
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(tsData.length());
    client.print("\n\n");
 
    client.print(tsData);
    
        
    lastConnectionTime = millis();
   
    if (client.connected())
    {
      Serial.println("  Connecting to ThingSpeak...");
      failedCounter = 0;
    }
    else
    {
      failedCounter++;
      Serial.println("  Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")-------");  
      software_Reset();     // Přidán reset ARDUINO
    }
   
  }
  else
  {
    failedCounter++;
   
    Serial.println("  Connection to ThingSpeak Failed ("+String(failedCounter, DEC)+")-------");  
    software_Reset(); 
    lastConnectionTime = millis();
  }
}
 
void startEthernet()  //Starý spuštění ETHERNET
{
  client.stop();
  Serial.println("Connecting Arduino to network...");
  Serial.println();  
  delay(1000);
  // Connect to network amd obtain an IP address using DHCP
  if (Ethernet.begin(mac) == 0)
  {
    Serial.println("DHCP Failed, reset Arduino to try again");
    Serial.println();
  }
  else
  {
    Serial.println("Arduino connected to network using DHCP");
    Serial.println();
  }
  delay(1000);
}

void startEthernet1()   //Nové spuštění ETHERNET
{
  client.stop();
  Serial.print("Connecting Arduino to network...");
  delay(1000);
  // Connect to network amd obtain an IP address using DHCP
  Ethernet.begin(mac)
  Udp.begin(localPort);
  Serial.print("----------------------------- My IP address: ");
  Serial.println(Ethernet.localIP());
}

// send an NTP request to the time server at the given address
void sendNTPpacket(const char * address) {
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); // NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

// RESET Arduina
// Ak sa pripojenie nepodarí, je tam možné zavolať funkciu, ktorá vykoná reset, či skôr... spustí program odznova a to cez asm inštrukciu jmp.
// Znova ti prebehne setup() atď..
void software_Reset(){
  asm volatile ("  jmp 0"); 
}

RDVanek
Příspěvky: 20
Registrován: 17 srp 2018, 10:36
Reputation: 0

Re: Data se na thingspeak přestanou posílat

Příspěvek od RDVanek » 17 črc 2020, 08:57

V kodu mi chybí jeden ;

Nicméně včera jsem nahrál upravený a dnes ráno se opět data přestala posílat.
Nejhorší, že nevím proč.
Ještě mne napadá, nemůže být problém ve zdroji? Mám tam 12V, ale nevím proud. Že by nebyl schopen dostatečně napájet?

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Data se na thingspeak přestanou posílat

Příspěvek od pavel1tu » 17 črc 2020, 09:55

No, mám dost výhrad, možná zbytečných, ale dětem z kroužku to podle toho českého příkladu odkud jsi čerpal i ty jede už 2 roky.
Těžko odhadnout kde se to kousne, dost neučesaný kod.

1) 12V zdroj - pokud napájíš LAN modul přes Arduino - ano může být problém a to že se stabilizátor (lineární) na Arduinu asi bude dost hřát. Někdo tu psal, že mu ten Ethernet shield žere až 500mA, mne i čínské klony si nevezmou více než 250mA - je pravda, že na pár kusech jsem naměřil více, ale ty se kousaly pořád a vyhodil jsem je - a neměly originál čip 5100. Při 250mA je na stabilizátoru ztrátové teplo 1,75W což by měl v pohodě dát, ale nad 300mA se nám u některých čínských klonů stávalo, že se začala aktivovat tepelná pojistka. Buď tam lípni kus hliníku, nebo vyzkoušej napájení 9V
2) úplně mi chybí po odeslání dat na thingspeak client.stop (proč to je v nějaké podmínce dej to tam natvrddo) - my před ním máme ještě delay(750)
3) update interval máš 0 ? i když se tu o tomto polemizuje, thingspeak má nějakou ochranu proti častým zápisům a pokud toto porušíš, tak tvé API blokne
4) nekousne se ti NTP dotaz ? Mne to někdy blblo, když se odpověď zpozdila nebo nedorazila. Já přešel na přesný čas s RTC modulem a dotaz na NTC dělám jen jednou za 30 dní - pokud je požadováno, nebo nechávám časovou značku připisovat server při ukládání (nejčastější řešení když jsou data jen na serveru)
5) ze senzorů schválně vyčítáš každý cyklus Arduina, nestačí jen před odesláním ? Dallas to někdy neustojí dej za vyčtení každého čidla nějaký delay, klidně 1000 jen pro zkoušku. Ještě nápad, nikdy jsem nepoužil toto globální vyčítání ze senzorů, já si vyčtu jejich adresy abych věděl který je který a po jednom je vyčítám, nevím jak se to bude chovat když jeden klekne.

PS: vidím dobře že nejprve zapisuješ data na thingspeak, pak teprve děláš dotaz na NTP ? A stejně čas pak nepoužíváš ?
Program bych lépe rozdělil aby byl přehlednější, funkci na vyčítání čidel, funkci na NTP, funkci na thingspeak - každá funkce může mít chybovou hlášku.
Já při problémech mám funkci na zobrazování chybových hlášek (pamatuje si jich až 50) na připojený OLED, který připojuji jen při ladění a problémech co se objevují za delší dobu

Jsem jen na mobilu, tak jsem mohl ve tvem kodu neco prehlednout, a omluv preklepy
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

RDVanek
Příspěvky: 20
Registrován: 17 srp 2018, 10:36
Reputation: 0

Re: Data se na thingspeak přestanou posílat

Příspěvek od RDVanek » 17 črc 2020, 11:20

Dik za rady, jsem začátečník a kod je slepeny z několika částí, které jsem kde našel a upravil si (NTP, DALAS, Thingspeak, Ethernet), proto ta "neučesanost"
ad 1) Ethernet shield je koupený v ARDUINO_SHOPu, tak to snad není čínský klon
ad 2) udělám
ad 3) updateThingSpeakInterval = 0 jen jako první hodnota, aby došlo hned po stratu arduina k odeslání dat, po odeslání se přepíše na 15 min
ad 4) NTP je fakt zbytečný, mám to jen kvuli výpisu na COM, jinak se nepoužívá
ad 5) Opravím, uvidím

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů