Freelance Project Requests info@CodeDocu.de Software Development in C# WPF Asp.Net Core Vba Excel Word SQL-Server EF Linq, UWP Net
#

Download:

Datei 1: esp32_Puls_Buttons_LCD_002.ino
Datei 2: LiquidCrystal_I2C.cpp
Datei 3: LiquidCrystal_I2C.h

 

 

Applies to ESP32 nodeMCU Arduino and LiquidCrystal_I2C LCD

 

When connecting LCD devices to an ESP32 microcontroller, it happens again and again that the LCD display displays weird cryptic characters after some time.

I had been looking for a solution for two days and uploaded various Arduino Library booths and examined various forums with soldering and interference signals.

The problem, however, was due to too high a clock rate.

 

 

 

Solution in Arduino / ESP32

 

You can change the clock rate of the I2C connection in the Wire.h Library.

Here you can integrate the Wire.h

 

#include <Wire.h>

 

Then you can change the clock rate, clock frequency at any point. Either in the init or loop

By entering Wird.setClock (clock rate in Hz).

 

Wire.setClock(10000);

 

 

Example Code, Arduino

 

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

..

 

//< Setup: LCD >

int lcdColumns = 16;

int lcdRows = 2;

//LCD Adress on 0x27

LiquidCrystal_I2C lcd(0x27lcdColumnslcdRows);  

//</ Setup: LCD >

 

 String lcd_Text0= String("Puls.: ") ;

 String lcd_Text1= String("Freq.: ") ;

 

    Wire.setClock(10000);

 

    int row0=0;

    int row1=1;

    int col0=0;

    int col1=0;

  

    

    lcd.setCursor(col0, row0);

    lcd.print(lcd_Text0);

    lcd.setCursor(col0,row1);

    lcd.print(lcd_Text1);

 

 

 

 

 

Example Code Application Pulse Encoder Arduino with adjustable pulse length PWM Duty

 

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

..

#include "wiring_shift_mod.h"

 

#define CLOCK_TYPE CLOCK_INVERT

#define CLOCK_DELAY_US 1

 

//====< VARIABLES >====

//< setup: TM1638 LED Buttons >

const int strobe_pin =  4;

const int clock_pin  = 16;

const int data_pin   = 17;

//</ setup: TM1638 LED Buttons >

 

//< button_values >

const int BTN_PULSWIDTH_DOWN=1;

const int BTN_PULSWIDTH_UP=128;

const long TIME_PUSHED_BUTTON_LONG=200;//us microsekonds

const long freq_MHz_Nanoseconds=1000;

const long freq_kHz_Nanoseconds=1000000;

const long freq_Hz_Nanoseconds=1000000000;

//</ button_values >

 

//< Pulse >

long nHighCyles=1;

unsigned long time_Button_press_start=0;

 

//</ Pulse >  

 

//< Setup: LCD >

int lcdColumns = 16;

int lcdRows = 2;

//LCD Adress on 0x27

LiquidCrystal_I2C lcd(0x27lcdColumnslcdRows);  

//</ Setup: LCD >

 

//< GPIO >

int OUT_PIN = 15;

 

int IN1=12;

int IN2=14;

int IN3=27;

int IN4=26;

int IN5=25;

int IN6=33;

int IN7=32;

int IN8=35;

int IN9=34;

//</ GPIO >

 

int min_Pulswidth_ns=166;

 

String lcd_Text="";

uint8_t last_buttons=0;

//====</ VARIABLES >====




//=============< SETUP >============

void setup(){

  //--------< setup() >--------

 

  

  //< GPIO >

  pinMode(OUT_PIN, OUTPUT);

  //</ GPIO >

 

  //< TM1638 Buttons >

  pinMode(strobe_pin, OUTPUT);

  pinMode(clock_pin, OUTPUT);

  pinMode(data_pin, OUTPUT);

 

  sendCommand(0x8f);  // activate

  //</ TM1638 Buttons >

 

  //< LCD >

  // initialize LCD

  //lcd.init();

  lcd.begin();

  // turn on LCD backlight                      

  lcd.backlight();

  //</ LCD >

    

  reset();

 

  Serial.begin(115200);

  Serial.println("\nPulswith Setter");

 

  uint32_t wire_clock=Wire.getClock();

  Serial.println(wire_clock);

  //--------</ setup() >--------

}

//=============</ SETUP >============





//=============< Main_Loop >============

void loop(){

  //--------< Main Loop() >--------

  //--< Read IN >--

  //int valIN =0;

  //actInput=0;

 

  //< read buttons TM1638 >

  uint8_t buttons = readButtons();

  //</ read buttons TM1638 >

  

  //< check buttons changed >

  bool buttons_changed=false;

  bool buttons_value_changed=false;

  if(buttons != last_buttons) buttons_value_changed=true;

  last_buttons=buttons; //save buttons state

  //</ check buttons changed >

  

  //< check push button time >

  unsigned long timeDiff_Button_pushed = millis()- time_Button_press_start ;

  //Serial.println("timeDiff_Button_pushed= " + String(timeDiff_Button_pushed));

  //</ check push button time >

  

  

  //----< check Button pushed >----

  if(buttons>0 )

  {

    //----< buttons pushed >---- 

    if ((buttons_value_changed==true ) || (timeDiff_Button_pushed > TIME_PUSHED_BUTTON_LONG))  

    {

      //----< Buttons_changed >----

      buttons_changed=true;

      Serial.println("Buttons changed to " + String(buttons));  //*value= 1 2 4 8 16 32 64 128  left to right

      time_Button_press_start=millis();

      

      //< show_button_led >

      for(uint8_t position = 0; position < 8; position++)

      {

        uint8_t mask = 0x1 << position;

        setLed(buttons & mask ? 1 : 0, position); //show Buttons on LED

      }

      //</ show_button_led >

      //--</ Read IN >--

    

      //--< calculate_buttons >--

      switch(buttons)

      {

        case BTN_PULSWIDTH_UP:

          nHighCyles=nHighCyles+1;

          break;

          

        case BTN_PULSWIDTH_DOWN:

          nHighCyles=nHighCyles-1;

          break;

      }

        

      if(nHighCyles<1) nHighCyles=1;

      //--</ calculate_buttons >--

  

      Serial.println(" nHighCycles=" + String(nHighCyles));

      //----</ Buttons_changed >----

    }

    //----</ buttons pushed >----

  }

  //----</ check Button pushed >----

 

  //----</ check Button long_pushed >----  

  

  

  

  //---< Signal OUT >---

  //*Square Signal with n-times ON

  //*short Impuls 1-20 ON=> 100ns-2us

  //1 x GPIO-Updae-Cycle=166ns nanoseconds

 

  //----< @Loop: nPulses >----

  int nPulses =20;

  for (int iPulse=0;iPulse<=nPulses;iPulse++)

  {

    //--< @loop: HIGH-Cycles >--

    for(long iHIGH=0;iHIGH<nHighCyles;iHIGH++)

    {

      digitalWrite(OUT_PIN, HIGH);   //PULS_ON

    }

    //--</ @loop: HIGH-Cycles >--

    

    //--< @loop: LOW-Cycles >--

    for(long iHIGH=0;iHIGH<nHighCyles;iHIGH++)

    {

      //< OFF >

      digitalWrite(OUT_PIN, LOW);    // PULS_OFF

      //</ OFF >

    }

    //--</ @loop: LOW-Cycles >--

  }

  //----</ @Loop: nPulses >----

 

  //*Service-Works in long Off-time

  //*long time

  delayMicroseconds(1000);              // wait for a second

  //--< OFF-Signal >--

  //---</ Signal OUT >---

  

 

  //< calculate >

  double nsPulswidth= double(nHighCyles * min_Pulswidth_ns);

  float frequency;

  long freqNanoseconds=0;

  String freqRangeText="";

  if (nsPulswidth<freq_MHz_Nanoseconds)

  {

    freqRangeText="MHz";

    frequency=double( freq_MHz_Nanoseconds / nsPulswidth );

  }

  else if (nsPulswidth<freq_kHz_Nanoseconds)

  {

    freqRangeText="kHz";

    frequency=double( freq_kHz_Nanoseconds / nsPulswidth );

  }

  else 

  {

    freqRangeText="Hz";

    frequency=double( freq_Hz_Nanoseconds / nsPulswidth );

  }

  //Serial.println("nHighCycles=" + String(nHighCyles)  + " nsPulswidth=" + String(nsPulswidth) + " frequency=" + String(frequency) );

  //</ calculate >

  

  //----< LCD Output >----

  if (buttons_changed==true)

  {

    long lngPulswidth=nsPulswidth;

    long lngFrequency=frequency;

    String lcd_Text0= String("Puls.: ") + String(lngPulswidth)  + " ns";

    lcd_Text0=lngPulswidth;

    //String lcd_Text0="line0..";

    //lcd_Text0=lcd_Text0.substring(0,15);

    String lcd_Text1= String("Freq.: ")  + String(lngFrequency) + " " + freqRangeText ;

    lcd_Text1=lngFrequency;

    //String lcd_Text1="line1..";

    //lcd_Text1=lcd_Text1.substring(0,15);

    

    //String lcd_Text1= String(nsPulswidth);

    //String lcd_Text1= String(float(nHighCyles));

    

    Serial.println(lcd_Text0 + " / " + lcd_Text1);

  

    //< display info on LCD >

    //lcd.clear(); 

    //lcd.begin();

    //lcd.home();

    Wire.setClock(10000);

    int row0=0;

    int row1=1;

    int col0=0;

    int col1=0;

  

    

    lcd.setCursor(col0, row0);

    lcd.print(lcd_Text0);

    lcd.setCursor(col0,row1);

    lcd.print(lcd_Text1);

 

    //</ display info on LCD >

  }

  //----</ LCD Output >----

  //--------</ Main Loop() >--------

}

//=============</ Main_Loop >============












//=============< functions: TM1638 >============

void sendCommand(uint8_t value)

{

  digitalWrite(strobe_pin, LOW);

  shiftOutMod(data_pin, clock_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, value);

  digitalWrite(strobe_pin, HIGH);

}

 

void reset()

{

  sendCommand(0x40); // set auto increment mode

  digitalWrite(strobe_pin, LOW);

  shiftOutMod(data_pin, clock_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0xc0);   // set starting address to 0

  for(uint8_t i = 0; i < 16; i++)

  {

    shiftOutMod(data_pin, clock_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0x00);

  }

  digitalWrite(strobe_pin, HIGH);

}



uint8_t readButtons(void)

{

  uint8_t buttons = 0;

  digitalWrite(strobe_pin, LOW);

  shiftOutMod(data_pin, clock_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0x42);

 

  pinMode(data_pin, INPUT);

  for (uint8_t i = 0; i < 4; i++)

  {

    //*ShiftIn: Einlesen 8* Bit von data_pin ->in->byte v. clock_type: 

    uint8_t v = shiftInMod(data_pin, clock_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US) << i;  //*bitshiftleft i-bits (2):  0001 -> 0100

    buttons |= v;   //*OR 00|01 -> 01

  }

  

  pinMode(data_pin, OUTPUT);

  digitalWrite(strobe_pin, HIGH);

  return buttons;

}







void setLed(uint8_t valueuint8_t position)

{

  pinMode(data_pin, OUTPUT);

 

  sendCommand(0x44);

  digitalWrite(strobe_pin, LOW);

  shiftOutMod(data_pin, clock_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0xC1 + (position << 1));

  shiftOutMod(data_pin, clock_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, value);

  digitalWrite(strobe_pin, HIGH);

}

//=============</ functions: TM1638 >============

 

 

 

Mobile
»
Switch with ESP32 MosFET and high voltages with optocoupler
»
Solved: conversion from void to non-scalar type String requested bei String.replace und toLowerCase
»
Arduino Code: Declare an Enum Type, a Variable and Compare it
»
Connect ESP32 to Bluetooth, work and write and read commands
»
Solved: LCD shows strange signs on ESP32
»
Arduino : switch case

.

Contact for Jobs, Project Requests: raimund.popp@microsoft-programmierer.de