Problemi comunicazione LCD I2C

Salve a tutti vi spiego in breve cosa ho fatto ed il problema che ho.
Il programmino è una base di partenza che ho scritto e sto testando, ed ha la funzione di gestire delle utenze, e cioè, io ho dei sensori capacitivi, che al momento dell'abilitazione, da programma mi chiudono un relè e nello stesso tempo mi fanno il passaggio di stato di 1 led ws2812b da bianco a verde, poi quando sulla suddetta utenza ho un assorbimento letto da un sensore 30 Ah il led passa a colore blù per segnalare l'utilizzo, inoltre ho scritto 2 righe anche per avere il valore di lettura (errato perchè manca ancora il calcolo della media) del sensore di assorbimento, inoltre se l'assorbimento diviene eccessivo cioè raggiunge e o supera 7Ah il relè viene spento ed il led passa in Rosso, sul display appare l'informazione di assorbimento eccessivo ed il valore, nel caso di spegnimento del sistema tramite capacitivo tutti i valori vengono riportati a 0 compresi gli errori.

Ora il problema è il seguente, funziona tutto a meraviglia ad eccezione del display, che nella fase di lettura d'assorbimento (stato blu del led) spesso ritarda di qualche secondo e più...

codice... ovviamente un sacco di roba commentata in test

/* Start of Code */

#include <FastLED.h> //Libreria Ws2812
//Librerie I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// inizializzo la libreria
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
LiquidCrystal_I2C lcd(0x3f, 16, 2);
//LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

// How many leds are connected?
#define NUM_LEDS 4

// Define the Pins
#define DATA_PIN 2

// Define the array of leds
CRGB leds[NUM_LEDS];

// Define Sensor pin
#define sens1 3 //Sensore Capacitivo

//Define Hall Sensor Pin
#define hall1 A0

//Define Relay Pin
#define relay1 4

//Delay whit millis function
int previousMillis = 0;
int currentMillis = 0;
int interval = 1000;
int interval2 = 200;

//Controllo Assorbimento
int check1 = 0;
int errorval = 0;
int mAh = 0;
int zero = 0; //Variabile mappa mAh

// Put color values in arrays
long invader1a[] =
{
  0x008000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x008000,
  0x008000, 0xFFFF00, 0x0000FF, 0xFFFF00, 0xFFFF00, 0x0000FF, 0xFFFF00, 0x008000,
  0x008000, 0x000000, 0xFFFF00, 0x800080, 0x800080, 0xFFFF00, 0x000000, 0x008000,
  0x000000, 0x000000, 0x000000, 0xFF0000, 0xFF0000, 0x000000, 0x000000, 0x000000
};

long invader1b[] =
{
  0x000000, 0x000000, 0x0000FF, 0xFFFF00, 0xFFFF00, 0x0000FF, 0x000000, 0x000000,
  0x000000, 0x008000, 0xFFFF00, 0x800080, 0x800080, 0xFFFF00, 0x008000, 0x000000,
  0x008000, 0x000000, 0x000000, 0xFFFF00, 0xFFFF00, 0x000000, 0x000000, 0x008000,
  0x000000, 0x008000, 0x000000, 0xFF0000, 0xFF0000, 0x000000, 0x008000, 0x000000
};


void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  Serial.begin(9600);      // open the serial port at 9600 bps:
  pinMode(sens1, INPUT);
  pinMode(relay1, OUTPUT);
  // inizializzo il display
  //lcd.begin(16,2);
  // accendo il LED che illumina il display
  lcd.backlight();
  lcd.init();

  //Bozza azzeramento variabile mappatura "mAh"
  digitalWrite(relay1, HIGH);
  delay(500);
  zero = analogRead(hall1);
  delay(10);

}

void loop() {

  mAh = map(analogRead(hall1), 0, zero, 300, 0); //Mappo Variabile "mAh"

  currentMillis = millis();

  //Se Sensore Capacitivo ON
  if (digitalRead(sens1) == 1) {

    //Se Assorbimento Inferiore a 7Ah
    if (mAh <= 70) {

      if (errorval < mAh) errorval = mAh; //Assegno valore Ah massimi a variabile "errorval"

      if (check1 == 0) {

        digitalWrite(relay1, LOW);

        if (mAh < 10) {

          leds[0] = CRGB::Green;
          leds[1] = CRGB::Black;
          leds[2] = CRGB::Black;
          leds[3] = CRGB::Black;
          FastLED.setBrightness(10);
          FastLED.show();
        }

        //Lettura Valore Assorbimento
        if (mAh > 15 && mAh < 70) {

          leds[0] = CRGB::Blue;
          leds[1] = CRGB::Black;
          leds[2] = CRGB::Black;
          leds[3] = CRGB::Black;
          FastLED.setBrightness(10);
          FastLED.show();

          //Funzione delay senza fermare il programma
          //currentMillis = millis();
          if (currentMillis - previousMillis >= interval2) {
            previousMillis = currentMillis;
            //Imposto la prima riga
            lcd.clear();
            lcd.setCursor(0, 0);
            //Scrivo
            lcd.print(mAh);
            lcd.print("00mAh Bagno");
            //Imposto la seconda riga
            lcd.setCursor(0, 1);
            //Scrivo
            lcd.print("Catamarano");
          }
        }
        else {
          lcd.clear();
        }
        //Fine Lettura
      }
    }

    //Se Assorbimento Superiore a 7 Ah
    else {

      check1 = 1;
      digitalWrite(relay1, HIGH);
      leds[0] = CRGB::Red;
      leds[1] = CRGB::Black;
      leds[2] = CRGB::Black;
      leds[3] = CRGB::Black;
      FastLED.setBrightness(10);
      FastLED.show();

      //Funzione delay senza fermare il programma
      //currentMillis = millis();
      //if (currentMillis - previousMillis >= interval2) {
      //previousMillis = currentMillis;
      //Imposto la prima riga
      //lcd.clear();
      lcd.setCursor(0, 0);
      //Scrivo
      lcd.print(errorval);
      lcd.print("00mAh");
      //Imposto la seconda riga
      lcd.setCursor(0, 1);
      //Scrivo
      lcd.print("Catamarano Errore");
      //}
      //Fine Lettura
    }
  }


  //Se Sensore Capacitivo OFF
  else {

    lcd.clear();
    errorval = 0;
    check1 = 0;
    digitalWrite(relay1, HIGH);
    leds[0] = CRGB::White;
    leds[1] = CRGB::Black;
    leds[2] = CRGB::Black;
    leds[3] = CRGB::Black;
    FastLED.setBrightness(10);
    FastLED.show();
  }
  //Funzione delay senza fermare il programma
  //currentMillis = millis();
  //if (currentMillis - previousMillis >= interval) {
  //previousMillis = currentMillis;
  //Fine Funzione
  if (check1 == 1) {
    Serial.print("Assorbimento ");
    Serial.print(errorval);
    Serial.println("00 mAh");
  }
  Serial.println(digitalRead(sens1));
  Serial.println(analogRead(hall1));
  Serial.print("Valore Relay ");
  Serial.print(mAh);
  Serial.println("00 mAh");
  //}
}

/* End of Code */

nello specifico la sezione che da problemi

//Lettura Valore Assorbimento
        if (mAh > 15 && mAh < 70) {

          leds[0] = CRGB::Blue;
          leds[1] = CRGB::Black;
          leds[2] = CRGB::Black;
          leds[3] = CRGB::Black;
          FastLED.setBrightness(10);
          FastLED.show();

          //Funzione delay senza fermare il programma
          //currentMillis = millis();
          if (currentMillis - previousMillis >= interval2) {
            previousMillis = currentMillis;
            //Imposto la prima riga
            lcd.clear();
            lcd.setCursor(0, 0);
            //Scrivo
            lcd.print(mAh);
            lcd.print("00mAh Bagno");
            //Imposto la seconda riga
            lcd.setCursor(0, 1);
            //Scrivo
            lcd.print("Catamarano");
          }
        }
        else {
          lcd.clear();
        }
        //Fine Lettura

intanto comincia con il dichiarare queste variabili come unsigned long

//Delay whit millis function
int previousMillis = 0;
int currentMillis = 0;
int interval = 1000;
int interval2 = 200;

ok si ho aggiustato quella parte la ed ho notato anche che così com'era strutturata mandava in palla l'if nel senso che anche se la situazione era vera poteva risultare falsa, quindi ho scritto qualche void in + ed ho separato la sezione sensori da quella lcd, ora qualcuno saprebbe spiegarmi come usare il "float" con "map", come si nota non sono un esperto di programmazione, ogni cavolata che cerco di fare devo studiare ma sul float ho trovato poco...

Nel tuo programma non hai nessun float.
La map lavora solo con long, ovvero no decimali