http: no connection when calling function from timer?

Hi,

I do some counting and try to transmit those values every minute to my server. When I call the transmitting function directly everything is fine. When I try to call the same function (MinutenTimer) by Timer then the connection (http) fails with ErrorCode -1.

What might be wrong? Thank you for your ideas. Here is the full sketch:

#include <ArduinoOTA.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <Ticker.h>

#ifndef STASSID
#define STASSID "###########"
#define STAPSK  "###########"
#endif

char wiFiHostname[ ] = "esp18_stromzaehler";

const char* ssid = STASSID;
const char* password = STAPSK;
const char* serverName1 = "##########";
int led=D4;

Ticker Timer;
unsigned long zaehler[4];
unsigned long bouncetime;
unsigned long lastbouncetime[4];

ICACHE_RAM_ATTR void interruptRoutine1() {bouncetime=millis();if(bouncetime-lastbouncetime[0] > 100) {zaehler[0]++; lastbouncetime[0]=bouncetime;}}
ICACHE_RAM_ATTR void interruptRoutine2() {bouncetime=millis();if(bouncetime-lastbouncetime[1] > 100) {zaehler[1]++; lastbouncetime[1]=bouncetime;}}
ICACHE_RAM_ATTR void interruptRoutine3() {bouncetime=millis();if(bouncetime-lastbouncetime[2] > 100) {zaehler[2]++; lastbouncetime[2]=bouncetime;}}
ICACHE_RAM_ATTR void interruptRoutine4() {bouncetime=millis();if(bouncetime-lastbouncetime[3] > 100) {zaehler[3]++; lastbouncetime[3]=bouncetime;}}

void MinutenTimer()
{
  WiFiClient client;
  HTTPClient http;

  http.setTimeout(15000);
  http.begin(client, serverName1);

  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  String httpRequestData = "z1=" + String(zaehler[0]);
  httpRequestData += "&z2=" + String(zaehler[1]);
  httpRequestData += "&z3=" + String(zaehler[2]);
  httpRequestData += "&z4=" + String(zaehler[3]);

  zaehler[0]=0;
  zaehler[1]=0;
  zaehler[2]=0;
  zaehler[3]=0;
 
  Serial.print("Data: ");
  Serial.print(httpRequestData);

  int httpResponseCode = http.POST(httpRequestData);
  if (httpResponseCode>0) {
    Serial.print(" HTTP Response code: ");
    Serial.println(httpResponseCode);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  http.end();
}


void setup()   {
  lastbouncetime[0]=0;
  lastbouncetime[1]=0;
  lastbouncetime[2]=0;
  lastbouncetime[3]=0;

  pinMode(D1, INPUT_PULLUP);
  pinMode(D2, INPUT_PULLUP);
  pinMode(D6, INPUT_PULLUP);
  pinMode(D7, INPUT_PULLUP);  

  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.setPhyMode(WIFI_PHY_MODE_11B);
  WiFi.begin(ssid, password);
  wifi_station_set_hostname(wiFiHostname);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    digitalWrite(led, !digitalRead(led));
  }
  digitalWrite(led, LOW);
  ArduinoOTA.setHostname(wiFiHostname);
  ArduinoOTA.setPassword(wiFiHostname);

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP addresse: ");
  Serial.println(WiFi.localIP());
 
  ArduinoOTA.begin();
  ArduinoOTA.handle();

  Timer.attach(60, MinutenTimer);
  attachInterrupt(D1, interruptRoutine1, FALLING);
  attachInterrupt(D2, interruptRoutine2, FALLING);
  attachInterrupt(D6, interruptRoutine3, FALLING);
  attachInterrupt(D7, interruptRoutine4, FALLING);

}

void loop() {
}

It seems that your Ticker library (for which you failed to provide a link!) uses some internal timer interrupt to provide the functionality. Network methods must not be called from interrupt context.

If you use a timer library that needs to be called from loop() (p.e. GitHub - sstaub/Ticker: Ticker library for Arduino) your problem should disappear.