can't get led blinking

I'm building a box with LEDs to notify me of my printer's toner levels.
it has x4 common anode RGB LEDs (one for each toner colour), each showing either green, yellow, or red depending on toner level.

The LED will go red when the toner is under 30%, I then want it to blink red when it goes under 20% but can't figure out how since the whole thing is within loop.
Obviously delay won't work, i've tried millis but that wouldn't work either.

Hope someone can help.

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define WLAN_SSID       "*"
#define WLAN_PASS       "*"

#define AIO_SERVER      "192.168.0.2"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "*"
#define AIO_KEY         "*"

const int cyrd = 13;
const int cygn = 12;
const int mgrd = 14;
const int mggn = 2;
const int ylrd = 0;
const int ylgn = 4;
const int bkrd = 5;
const int bkgn = 16;
WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Subscribe black = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/black");
Adafruit_MQTT_Subscribe cyan = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/cyan");
Adafruit_MQTT_Subscribe magenta = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/magenta");
Adafruit_MQTT_Subscribe yellow = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/yellow");

void MQTT_connect();

void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(cyrd,OUTPUT);
  pinMode(cygn,OUTPUT);
  pinMode(ylrd,OUTPUT);
  pinMode(ylgn,OUTPUT);
  pinMode(mgrd,OUTPUT);
  pinMode(mggn,OUTPUT);
  pinMode(bkrd,OUTPUT);
  pinMode(bkgn,OUTPUT);

digitalWrite(bkgn, HIGH);
digitalWrite(bkrd, HIGH);
digitalWrite(cygn, HIGH);
digitalWrite(cyrd, HIGH);
digitalWrite(mggn, HIGH);
digitalWrite(mgrd, HIGH);
digitalWrite(ylrd, HIGH);
digitalWrite(ylgn, HIGH);

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());

  mqtt.subscribe(&black);
  mqtt.subscribe(&cyan);
  mqtt.subscribe(&magenta);
  mqtt.subscribe(&yellow);
}

void loop() {
  MQTT_connect();
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
      if (subscription == &black) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)black.lastread);
        uint8_t num = atoi((char *)black.lastread);
        if (num>60) {
          digitalWrite(bkgn, LOW);
          digitalWrite(bkrd, HIGH);
          }
        } 
      if (subscription == &black) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)black.lastread);
        uint8_t num = atoi((char *)black.lastread);
        if (num<60 && num>30) {
          digitalWrite(bkgn, LOW);
          digitalWrite(bkrd, LOW);
          }
        } 
      if (subscription == &black) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)black.lastread);
        uint8_t num = atoi((char *)black.lastread);
        if (num<30
        ) {
          digitalWrite(bkgn, HIGH);
          digitalWrite(bkrd, LOW);
          }
        } 
      if (subscription == &cyan) {
        Serial.print(F("Got_cyan: "));
        Serial.println((char *)cyan.lastread);
        uint8_t num = atoi((char *)cyan.lastread);
        if (num>60) {
          digitalWrite(cygn, LOW);
          digitalWrite(cyrd, HIGH);
          }
        } 
      if (subscription == &cyan) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)cyan.lastread);
        uint8_t num = atoi((char *)cyan.lastread);
        if (num<60 && num>25) {
          digitalWrite(cygn, LOW);
          digitalWrite(cyrd, LOW);
          }
        } 
      if (subscription == &cyan) {
        Serial.print(F("Got_cyan: "));
        Serial.println((char *)cyan.lastread);
        uint8_t num = atoi((char *)cyan.lastread);
        if (num<25) {
          digitalWrite(cygn, HIGH);
          digitalWrite(cyrd, LOW);
          }
        } 
      if (subscription == &magenta) {
        Serial.print(F("Got_magenta: "));
        Serial.println((char *)magenta.lastread);
        uint8_t num = atoi((char *)magenta.lastread);
        if (num>60) {
          digitalWrite(mggn, LOW);
          digitalWrite(mgrd, HIGH);
          }
        } 
      if (subscription == &magenta) {
        Serial.print(F("Got_magenta: "));
        Serial.println((char *)magenta.lastread);
        uint8_t num = atoi((char *)magenta.lastread);
        if (num<60 && num>25) {
          digitalWrite(mggn, LOW);
          digitalWrite(mgrd, LOW);
          }
        } 
      if (subscription == &magenta) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)magenta.lastread);
        uint8_t num = atoi((char *)magenta.lastread);
        if (num<25) {
          digitalWrite(mggn, HIGH);
          digitalWrite(mgrd, LOW);
          }
        } 
      if (subscription == &yellow) {
        Serial.print(F("Got_yellow: "));
        Serial.println((char *)yellow.lastread);
        uint8_t num = atoi((char *)yellow.lastread);
        if (num<60 && num>25) {
          digitalWrite(ylgn, LOW);
          digitalWrite(ylrd, LOW);
          }
        } 
      if (subscription == &yellow) {
        Serial.print(F("Got_yellow: "));
        Serial.println((char *)yellow.lastread);
        uint8_t num = atoi((char *)yellow.lastread);
        if (num<25) {
          digitalWrite(ylgn, HIGH);
          digitalWrite(ylrd, LOW);
          }
        } 
      if (subscription == &yellow) {
        Serial.print(F("Got_yellow: "));
        Serial.println((char *)yellow.lastread);
        uint8_t num = atoi((char *)yellow.lastread);
        if (num<25) {
          digitalWrite(ylgn, HIGH);
          digitalWrite(ylrd, LOW);
          }
        } 
    }
  if(! mqtt.ping()) {
    mqtt.disconnect();
  }
}

void MQTT_connect() {
  int8_t ret;

  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);
       retries--;
       if (retries == 0) {
         while (1);
       }
  }
  Serial.println("MQTT Connected!");
}

Post your attempt with millis.

Hello bigmac5753, welcome to the Arduino forum.

First ++Karma for putting the code in your first post in code tags and asking meaningful question. If you read the first attempts of others you will see how frustrating it is when people don't follow the forum instructions.

I don't know the answer specifically but I suggest a helpful approach is to break you sketch into separate functions that do a well defined part of the over all program . You main loop should contain only calls to these functions, nothing else. Once you do that it makes it a lot easier to work through and see what works and what needs changing.

wildbill:
Post your attempt with millis.

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define WLAN_SSID       "*"
#define WLAN_PASS       "*"

#define AIO_SERVER      "192.168.0.2"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "*"
#define AIO_KEY         "*"

unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1000;

const int cyrd = 13;
const int cygn = 12;
const int mgrd = 14;
const int mggn = 2;
const int ylrd = 0;
const int ylgn = 4;
const int bkrd = 5;
const int bkgn = 16;
WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Subscribe black = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/black");
Adafruit_MQTT_Subscribe cyan = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/cyan");
Adafruit_MQTT_Subscribe magenta = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/magenta");
Adafruit_MQTT_Subscribe yellow = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/yellow");

void MQTT_connect();

void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(cyrd,OUTPUT);
  pinMode(cygn,OUTPUT);
  pinMode(ylrd,OUTPUT);
  pinMode(ylgn,OUTPUT);
  pinMode(mgrd,OUTPUT);
  pinMode(mggn,OUTPUT);
  pinMode(bkrd,OUTPUT);
  pinMode(bkgn,OUTPUT);
  startMillis = millis(); 
  digitalWrite(bkgn, HIGH);
  digitalWrite(bkrd, HIGH);
  digitalWrite(cygn, HIGH);
  digitalWrite(cyrd, HIGH);
  digitalWrite(mggn, HIGH);
  digitalWrite(mgrd, HIGH);
  digitalWrite(ylrd, HIGH);
  digitalWrite(ylgn, HIGH);

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());

  mqtt.subscribe(&black);
  mqtt.subscribe(&cyan);
  mqtt.subscribe(&magenta);
  mqtt.subscribe(&yellow);
}

void loop() {
  MQTT_connect();
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
      if (subscription == &black) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)black.lastread);
        uint8_t num = atoi((char *)black.lastread);
        if (num>60) {
          digitalWrite(bkgn, LOW);
          digitalWrite(bkrd, HIGH);
          }
        } 
      if (subscription == &black) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)black.lastread);
        uint8_t num = atoi((char *)black.lastread);
        if (num<60 && num>30) {
          digitalWrite(bkgn, LOW);
          digitalWrite(bkrd, LOW);
          }
        } 
      if (subscription == &black) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)black.lastread);
        uint8_t num = atoi((char *)black.lastread);
        if (num<30 && num>20){
          digitalWrite(bkgn, HIGH);
          digitalWrite(bkrd, LOW);
          }
        } 
      if (subscription == &black) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)black.lastread);
        uint8_t num = atoi((char *)black.lastread);
        if (num<20) {
          currentMillis = millis();  
          if (currentMillis - startMillis >= period){
            digitalWrite(bkrd, !digitalRead(bkrd));  
            startMillis = currentMillis; 
            }
          }
        } 
      if (subscription == &cyan) {
        Serial.print(F("Got_cyan: "));
        Serial.println((char *)cyan.lastread);
        uint8_t num = atoi((char *)cyan.lastread);
        if (num>60) {
          digitalWrite(cygn, LOW);
          digitalWrite(cyrd, HIGH);
          }
        } 
      if (subscription == &cyan) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)cyan.lastread);
        uint8_t num = atoi((char *)cyan.lastread);
        if (num<60 && num>25) {
          digitalWrite(cygn, LOW);
          digitalWrite(cyrd, LOW);
          }
        } 
      if (subscription == &cyan) {
        Serial.print(F("Got_cyan: "));
        Serial.println((char *)cyan.lastread);
        uint8_t num = atoi((char *)cyan.lastread);
        if (num<25) {
          digitalWrite(cygn, HIGH);
          digitalWrite(cyrd, LOW);
          }
        } 
      if (subscription == &magenta) {
        Serial.print(F("Got_magenta: "));
        Serial.println((char *)magenta.lastread);
        uint8_t num = atoi((char *)magenta.lastread);
        if (num>60) {
          digitalWrite(mggn, LOW);
          digitalWrite(mgrd, HIGH);
          }
        } 
      if (subscription == &magenta) {
        Serial.print(F("Got_magenta: "));
        Serial.println((char *)magenta.lastread);
        uint8_t num = atoi((char *)magenta.lastread);
        if (num<60 && num>25) {
          digitalWrite(mggn, LOW);
          digitalWrite(mgrd, LOW);
          }
        } 
      if (subscription == &magenta) {
        Serial.print(F("Got_black: "));
        Serial.println((char *)magenta.lastread);
        uint8_t num = atoi((char *)magenta.lastread);
        if (num<25) {
          digitalWrite(mggn, HIGH);
          digitalWrite(mgrd, LOW);
          }
        } 
      if (subscription == &yellow) {
        Serial.print(F("Got_yellow: "));
        Serial.println((char *)yellow.lastread);
        uint8_t num = atoi((char *)yellow.lastread);
        if (num<60 && num>25) {
          digitalWrite(ylgn, LOW);
          digitalWrite(ylrd, LOW);
          }
        } 
      if (subscription == &yellow) {
        Serial.print(F("Got_yellow: "));
        Serial.println((char *)yellow.lastread);
        uint8_t num = atoi((char *)yellow.lastread);
        if (num<25) {
          digitalWrite(ylgn, HIGH);
          digitalWrite(ylrd, LOW);
          }
        } 
      if (subscription == &yellow) {
        Serial.print(F("Got_yellow: "));
        Serial.println((char *)yellow.lastread);
        uint8_t num = atoi((char *)yellow.lastread);
        if (num<25) {
          digitalWrite(ylgn, HIGH);
          digitalWrite(ylrd, LOW);
          }
        } 
    }
  if(! mqtt.ping()) {
    mqtt.disconnect();
  }
}

void MQTT_connect() {
  int8_t ret;

  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);
       retries--;
       if (retries == 0) {
         while (1);
       }
  }
  Serial.println("MQTT Connected!");
}

PerryBebbington:
Hello bigmac5753, welcome to the Arduino forum.

First ++Karma for putting the code in your first post in code tags and asking meaningful question. If you read the first attempts of others you will see how frustrating it is when people don't follow the forum instructions.

I don't know the answer specifically but I suggest a helpful approach is to break you sketch into separate functions that do a well defined part of the over all program . You main loop should contain only calls to these functions, nothing else. Once you do that it makes it a lot easier to work through and see what works and what needs changing.

Thanks for that.

I agree it does get frustrating when little to no information is provided. I have to be honest and say I haven't actually read the rules / forum instructions etc...
I'd rather just provide all the information upfront and save time further down the line.

millis logic looks ok, what do you get from the serial port and your black indicator LED when you try it?

wildbill:
millis logic looks ok, what do you get from the serial port and your black indicator LED when you try it?

Serial monitor looks OK, just displaying values. The LED goes off when the value drops below 20

I assumed that there was something wrong with your timing logic so I cut out all the wifi and MQTT stuff and found that what's there flashes the LED as expected. Maybe try this?

#define WLAN_SSID       "*"
#define WLAN_PASS       "*"

#define AIO_SERVER      "192.168.0.2"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "*"
#define AIO_KEY         "*"

unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1000;

const int cyrd = 13;
const int cygn = 12;
const int mgrd = 14;
const int mggn = 2;
const int ylrd = 0;
const int ylgn = 4;
const int bkrd = 5;
const int bkgn = 16;
#define BLACK 1
int subscription = BLACK;
int num = 16;
void setup()
{
  Serial.begin(115200);
  delay(10);
  pinMode(cyrd, OUTPUT);
  pinMode(cygn, OUTPUT);
  pinMode(ylrd, OUTPUT);
  pinMode(ylgn, OUTPUT);
  pinMode(mgrd, OUTPUT);
  pinMode(mggn, OUTPUT);
  pinMode(bkrd, OUTPUT);
  pinMode(bkgn, OUTPUT);
  startMillis = millis();
  digitalWrite(bkgn, HIGH);
  digitalWrite(bkrd, HIGH);
  digitalWrite(cygn, HIGH);
  digitalWrite(cyrd, HIGH);
  digitalWrite(mggn, HIGH);
  digitalWrite(mgrd, HIGH);
  digitalWrite(ylrd, HIGH);
  digitalWrite(ylgn, HIGH);
  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);
  Serial.println();
  Serial.println("WiFi connected");
}

void loop()
{
  {
    if (subscription == BLACK)
    {
      Serial.println(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num > 60)
      {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, HIGH);
      }
    }
    if (subscription == BLACK)
    {
      Serial.print(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num < 60 && num > 30)
      {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == BLACK)
    {
      Serial.print(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num < 30 && num > 20)
      {
        digitalWrite(bkgn, HIGH);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == BLACK)
    {
      Serial.print(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num < 20)
      {
        currentMillis = millis();
        if (currentMillis - startMillis >= period)
        {
          digitalWrite(bkrd, !digitalRead(bkrd));
          startMillis = currentMillis;
        }
      }
    }
  }
}

Going to get sh*t for this but you can try this as a different approach.

Compiles, not tested.

You have some calls that block; if they block long enough they can mess up the blinking timing but that's going to be a problem no matter how you approach making your LEDs blink in the low-toner condition.

(Had to attach; too long to post in tags...)

toner_blink.ino (9.28 KB)

wildbill:
I assumed that there was something wrong with your timing logic so I cut out all the wifi and MQTT stuff and found that what's there flashes the LED as expected. Maybe try this?

#define WLAN_SSID       "*"

#define WLAN_PASS      "*"

#define AIO_SERVER      "192.168.0.2"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    ""
#define AIO_KEY        "
"

unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1000;

const int cyrd = 13;
const int cygn = 12;
const int mgrd = 14;
const int mggn = 2;
const int ylrd = 0;
const int ylgn = 4;
const int bkrd = 5;
const int bkgn = 16;
#define BLACK 1
int subscription = BLACK;
int num = 16;
void setup()
{
  Serial.begin(115200);
  delay(10);
  pinMode(cyrd, OUTPUT);
  pinMode(cygn, OUTPUT);
  pinMode(ylrd, OUTPUT);
  pinMode(ylgn, OUTPUT);
  pinMode(mgrd, OUTPUT);
  pinMode(mggn, OUTPUT);
  pinMode(bkrd, OUTPUT);
  pinMode(bkgn, OUTPUT);
  startMillis = millis();
  digitalWrite(bkgn, HIGH);
  digitalWrite(bkrd, HIGH);
  digitalWrite(cygn, HIGH);
  digitalWrite(cyrd, HIGH);
  digitalWrite(mggn, HIGH);
  digitalWrite(mgrd, HIGH);
  digitalWrite(ylrd, HIGH);
  digitalWrite(ylgn, HIGH);
  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);
  Serial.println();
  Serial.println("WiFi connected");
}

void loop()
{
  {
    if (subscription == BLACK)
    {
      Serial.println(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num > 60)
      {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, HIGH);
      }
    }
    if (subscription == BLACK)
    {
      Serial.print(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num < 60 && num > 30)
      {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == BLACK)
    {
      Serial.print(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num < 30 && num > 20)
      {
        digitalWrite(bkgn, HIGH);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == BLACK)
    {
      Serial.print(F("Got_black: "));
      //Serial.println((char *)black.lastread);
      //uint8_t num = atoi((char *)black.lastread);
      if (num < 20)
      {
        currentMillis = millis();
        if (currentMillis - startMillis >= period)
        {
          digitalWrite(bkrd, !digitalRead(bkrd));
          startMillis = currentMillis;
        }
      }
    }
  }
}

Without any input from MQTT, how am I able to change the value?

Just hardcode it. I've set it to 16 to exercise the flashing case. Try some other numbers for your other scenarios; you'll have to recompile of course.

Blackfin:
Going to get sh*t for this but you can try this as a different approach.

Compiles, not tested.

You have some calls that block; if they block long enough they can mess up the blinking timing but that's going to be a problem no matter how you approach making your LEDs blink in the low-toner condition.

(Had to attach; too long to post in tags...)

The LED stays green no matter what value. It's a common anode LED, if that makes a difference to the code.

wildbill:
Just hardcode it. I've set it to 16 to exercise the flashing case. Try some other numbers for your other scenarios; you'll have to recompile of course.

OK done that and I have a blinking LED.

I have just discovered something, not sure how relevant this is but sometimes when the value changes and still under 20, the LED changes state. Also, if I resend the same value, it sometimes changes state.

Think you've gotten ahead of me while I was trying to test this out, but see if this will compile. Trying to find the correct esp8266 library is frustrating me.

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define WLAN_SSID       "*"
#define WLAN_PASS       "*"

#define AIO_SERVER      "192.168.0.2"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "*"
#define AIO_KEY         "*"

unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1000;

const int cyrd = 13;
const int cygn = 12;
const int mgrd = 14;
const int mggn = 2;
const int ylrd = 0;
const int ylgn = 4;
const int bkrd = 5;
const int bkgn = 16;

bool blinkState = LOW;
bool blinkBlack = false;
bool blinkCyan = false;
bool blinkMagenta = false;
bool blinkYellow = false;

WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Subscribe black = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/black");
Adafruit_MQTT_Subscribe cyan = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/cyan");
Adafruit_MQTT_Subscribe magenta = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/magenta");
Adafruit_MQTT_Subscribe yellow = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/yellow");

void MQTT_connect();

void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(cyrd, OUTPUT);
  pinMode(cygn, OUTPUT);
  pinMode(ylrd, OUTPUT);
  pinMode(ylgn, OUTPUT);
  pinMode(mgrd, OUTPUT);
  pinMode(mggn, OUTPUT);
  pinMode(bkrd, OUTPUT);
  pinMode(bkgn, OUTPUT);
  startMillis = millis();
  digitalWrite(bkgn, HIGH);
  digitalWrite(bkrd, HIGH);
  digitalWrite(cygn, HIGH);
  digitalWrite(cyrd, HIGH);
  digitalWrite(mggn, HIGH);
  digitalWrite(mgrd, HIGH);
  digitalWrite(ylrd, HIGH);
  digitalWrite(ylgn, HIGH);

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());

  mqtt.subscribe(&black);
  mqtt.subscribe(&cyan);
  mqtt.subscribe(&magenta);
  mqtt.subscribe(&yellow);
}

void loop() {
  currentMillis = millis();
  if ((currentMillis - startMillis) >= period) {
    startMillis = currentMillis;
    blinkState = !blinkState;
    if (blinkBlack) {
      digitalWrite(bkrd, blinkState);
    }
    if (blinkCyan) {
      digitalWrite(cyrd, blinkState);
    }
    if (blinkMagenta) {
      digitalWrite(mgrd, blinkState);
    }
    if (blinkYellow) {
      digitalWrite(ylrd, blinkState);
    }
  }
  MQTT_connect();
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num > 60) {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, HIGH);
      }
    }
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num < 60 && num > 30) {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num < 30 && num > 20) {
        digitalWrite(bkgn, HIGH);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num < 20) {
        blinkBlack = true;
        //  currentMillis = millis();
        //  if (currentMillis - startMillis >= period){
        //    digitalWrite(bkrd, !digitalRead(bkrd));
        //    startMillis = currentMillis;
      } else {
        blinkBlack = false;
      }
    }
    if (subscription == &cyan) {
      Serial.print(F("Got_cyan: "));
      Serial.println((char *)cyan.lastread);
      uint8_t num = atoi((char *)cyan.lastread);
      if (num > 60) {
        digitalWrite(cygn, LOW);
        digitalWrite(cyrd, HIGH);
      }
    }
    if (subscription == &cyan) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)cyan.lastread);
      uint8_t num = atoi((char *)cyan.lastread);
      if (num < 60 && num > 25) {
        digitalWrite(cygn, LOW);
        digitalWrite(cyrd, LOW);
      }
    }
    if (subscription == &cyan) {
      Serial.print(F("Got_cyan: "));
      Serial.println((char *)cyan.lastread);
      uint8_t num = atoi((char *)cyan.lastread);
      if (num < 25) {
        digitalWrite(cygn, HIGH);
        digitalWrite(cyrd, LOW);
      }
    }
    if (subscription == &magenta) {
      Serial.print(F("Got_magenta: "));
      Serial.println((char *)magenta.lastread);
      uint8_t num = atoi((char *)magenta.lastread);
      if (num > 60) {
        digitalWrite(mggn, LOW);
        digitalWrite(mgrd, HIGH);
      }
    }
    if (subscription == &magenta) {
      Serial.print(F("Got_magenta: "));
      Serial.println((char *)magenta.lastread);
      uint8_t num = atoi((char *)magenta.lastread);
      if (num < 60 && num > 25) {
        digitalWrite(mggn, LOW);
        digitalWrite(mgrd, LOW);
      }
    }
    if (subscription == &magenta) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)magenta.lastread);
      uint8_t num = atoi((char *)magenta.lastread);
      if (num < 25) {
        digitalWrite(mggn, HIGH);
        digitalWrite(mgrd, LOW);
      }
    }
    if (subscription == &yellow) {
      Serial.print(F("Got_yellow: "));
      Serial.println((char *)yellow.lastread);
      uint8_t num = atoi((char *)yellow.lastread);
      if (num < 60 && num > 25) {
        digitalWrite(ylgn, LOW);
        digitalWrite(ylrd, LOW);
      }
    }
    if (subscription == &yellow) {
      Serial.print(F("Got_yellow: "));
      Serial.println((char *)yellow.lastread);
      uint8_t num = atoi((char *)yellow.lastread);
      if (num < 25) {
        digitalWrite(ylgn, HIGH);
        digitalWrite(ylrd, LOW);
      }
    }
    if (subscription == &yellow) {
      Serial.print(F("Got_yellow: "));
      Serial.println((char *)yellow.lastread);
      uint8_t num = atoi((char *)yellow.lastread);
      if (num < 25) {
        digitalWrite(ylgn, HIGH);
        digitalWrite(ylrd, LOW);
      }
    }
  }
  if (! mqtt.ping()) {
    mqtt.disconnect();
  }
}

void MQTT_connect() {
  int8_t ret;

  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);
    retries--;
    if (retries == 0) {
      while (1);
    }
  }
  Serial.println("MQTT Connected!");
}

david_2018:
Think you've gotten ahead of me while I was trying to test this out, but see if this will compile. Trying to find the correct esp8266 library is frustrating me.

#include <ESP8266WiFi.h>

#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define WLAN_SSID      ""
#define WLAN_PASS      "
"

#define AIO_SERVER      "192.168.0.2"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    ""
#define AIO_KEY        "
"

unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1000;

const int cyrd = 13;
const int cygn = 12;
const int mgrd = 14;
const int mggn = 2;
const int ylrd = 0;
const int ylgn = 4;
const int bkrd = 5;
const int bkgn = 16;

bool blinkState = LOW;
bool blinkBlack = false;
bool blinkCyan = false;
bool blinkMagenta = false;
bool blinkYellow = false;

WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Subscribe black = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/black");
Adafruit_MQTT_Subscribe cyan = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/cyan");
Adafruit_MQTT_Subscribe magenta = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/magenta");
Adafruit_MQTT_Subscribe yellow = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/toner/yellow");

void MQTT_connect();

void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(cyrd, OUTPUT);
  pinMode(cygn, OUTPUT);
  pinMode(ylrd, OUTPUT);
  pinMode(ylgn, OUTPUT);
  pinMode(mgrd, OUTPUT);
  pinMode(mggn, OUTPUT);
  pinMode(bkrd, OUTPUT);
  pinMode(bkgn, OUTPUT);
  startMillis = millis();
  digitalWrite(bkgn, HIGH);
  digitalWrite(bkrd, HIGH);
  digitalWrite(cygn, HIGH);
  digitalWrite(cyrd, HIGH);
  digitalWrite(mggn, HIGH);
  digitalWrite(mgrd, HIGH);
  digitalWrite(ylrd, HIGH);
  digitalWrite(ylgn, HIGH);

// Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());

mqtt.subscribe(&black);
  mqtt.subscribe(&cyan);
  mqtt.subscribe(&magenta);
  mqtt.subscribe(&yellow);
}

void loop() {
  currentMillis = millis();
  if ((currentMillis - startMillis) >= period) {
    startMillis = currentMillis;
    blinkState = !blinkState;
    if (blinkBlack) {
      digitalWrite(bkrd, blinkState);
    }
    if (blinkCyan) {
      digitalWrite(cyrd, blinkState);
    }
    if (blinkMagenta) {
      digitalWrite(mgrd, blinkState);
    }
    if (blinkYellow) {
      digitalWrite(ylrd, blinkState);
    }
  }
  MQTT_connect();
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num > 60) {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, HIGH);
      }
    }
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num < 60 && num > 30) {
        digitalWrite(bkgn, LOW);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num < 30 && num > 20) {
        digitalWrite(bkgn, HIGH);
        digitalWrite(bkrd, LOW);
      }
    }
    if (subscription == &black) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)black.lastread);
      uint8_t num = atoi((char *)black.lastread);
      if (num < 20) {
        blinkBlack = true;
        //  currentMillis = millis();
        //  if (currentMillis - startMillis >= period){
        //    digitalWrite(bkrd, !digitalRead(bkrd));
        //    startMillis = currentMillis;
      } else {
        blinkBlack = false;
      }
    }
    if (subscription == &cyan) {
      Serial.print(F("Got_cyan: "));
      Serial.println((char *)cyan.lastread);
      uint8_t num = atoi((char *)cyan.lastread);
      if (num > 60) {
        digitalWrite(cygn, LOW);
        digitalWrite(cyrd, HIGH);
      }
    }
    if (subscription == &cyan) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)cyan.lastread);
      uint8_t num = atoi((char *)cyan.lastread);
      if (num < 60 && num > 25) {
        digitalWrite(cygn, LOW);
        digitalWrite(cyrd, LOW);
      }
    }
    if (subscription == &cyan) {
      Serial.print(F("Got_cyan: "));
      Serial.println((char *)cyan.lastread);
      uint8_t num = atoi((char *)cyan.lastread);
      if (num < 25) {
        digitalWrite(cygn, HIGH);
        digitalWrite(cyrd, LOW);
      }
    }
    if (subscription == &magenta) {
      Serial.print(F("Got_magenta: "));
      Serial.println((char *)magenta.lastread);
      uint8_t num = atoi((char *)magenta.lastread);
      if (num > 60) {
        digitalWrite(mggn, LOW);
        digitalWrite(mgrd, HIGH);
      }
    }
    if (subscription == &magenta) {
      Serial.print(F("Got_magenta: "));
      Serial.println((char *)magenta.lastread);
      uint8_t num = atoi((char *)magenta.lastread);
      if (num < 60 && num > 25) {
        digitalWrite(mggn, LOW);
        digitalWrite(mgrd, LOW);
      }
    }
    if (subscription == &magenta) {
      Serial.print(F("Got_black: "));
      Serial.println((char *)magenta.lastread);
      uint8_t num = atoi((char *)magenta.lastread);
      if (num < 25) {
        digitalWrite(mggn, HIGH);
        digitalWrite(mgrd, LOW);
      }
    }
    if (subscription == &yellow) {
      Serial.print(F("Got_yellow: "));
      Serial.println((char *)yellow.lastread);
      uint8_t num = atoi((char *)yellow.lastread);
      if (num < 60 && num > 25) {
        digitalWrite(ylgn, LOW);
        digitalWrite(ylrd, LOW);
      }
    }
    if (subscription == &yellow) {
      Serial.print(F("Got_yellow: "));
      Serial.println((char *)yellow.lastread);
      uint8_t num = atoi((char *)yellow.lastread);
      if (num < 25) {
        digitalWrite(ylgn, HIGH);
        digitalWrite(ylrd, LOW);
      }
    }
    if (subscription == &yellow) {
      Serial.print(F("Got_yellow: "));
      Serial.println((char *)yellow.lastread);
      uint8_t num = atoi((char *)yellow.lastread);
      if (num < 25) {
        digitalWrite(ylgn, HIGH);
        digitalWrite(ylrd, LOW);
      }
    }
  }
  if (! mqtt.ping()) {
    mqtt.disconnect();
  }
}

void MQTT_connect() {
  int8_t ret;

if (mqtt.connected()) {
    return;
  }

Serial.print("Connecting to MQTT... ");

uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);
    retries--;
    if (retries == 0) {
      while (1);
    }
  }
  Serial.println("MQTT Connected!");
}

Thanks, this is working. LED on for 5 sec, off for 5 sec.

Is this controlling the timing:

const unsigned long period = 1000;

I tried lowering it to make it blink faster but it didn't seem to make a difference.

FYI the library i'm using is: WiFiManager by tzapu

bigmac5753:
The LED stays green no matter what value. It's a common anode LED, if that makes a difference to the code.

Just to verify, the Serial.println() calls for each subscription show a value that would indicate the need for a different LED state?

The delay in this part of your code is what has an overriding control on your timing:
All I did was move the actual timing loop for the blinking LED out of the rest of the code, on the assumption that the black ink level wasn't getting updated very often.

void MQTT_connect() {
  int8_t ret;

  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);
    retries--;
    if (retries == 0) {
      while (1);
    }
  }
  Serial.println("MQTT Connected!");
}

Oops, my unfamiliarity with the Wifi is definitely showing, looks like this is also a primary reason for the 5 second delay:

while ((subscription = mqtt.readSubscription(5000)))