Now a days the most advance solar charge controller are Maximum Power Point Tracking (MPPT). These controllers are more expensive than the PWM charge controllers, but it has several advantages in compare to. The MPPT charge controllers are used for extracting the maximum available power from solar panels for charging battery under certain conditions.
Of corse, you can buy one because to build one require some basic knowledge of electronics.
MPPT circuit is based around a synchronous buck converter circuit.
I shall not insist upon it. There are lot of knowledge on this site. A good job was made by Julian Ilett, who put a lot of youtube tutorials waiting for you.
First you can try one of that kind of converters and after a little encouragement and success you cant start an new project if you don`t keep reading the last one of these:
– Tim Nolan web archive page, with folowing link
–Arduino powered solar battery charger
–Arduino solar charge controller
–Arduino based MPPT solar charger controller
I thanks to all of them for sharing their knowledge. The first one is Tim Nolan who initiated this adventure. And I think you will not be the last who will try.
Now I can not tell you “Abandon all hope, ye who enter here.” but will not be so easy and you may try that just one more time in your life.
All of these enthusiasts was inspired me to build one, and finish this project.
In this page deba168 wrote on 29.07.2016: āI am no more working on this project due to some issues. This controller is not working.ā
I think you wrong. Your project is living. Look at here. I have nothing to complain. I just made some little changes, et voila…
In the next image are the waveforms of input signals for the MOSFET`s and the output signal :
The waveforms are for 5V/div amplitude and 5 us/div timebase.
And this is the image of my functional MPPT Solar Charger powered by an Mono Crystalline Silicon PV Module, with a maximum power of 50W (maximum 21,5V / 3,5A) , for charging a 12 V lead acid battery:
The Arduino code is from from MPPT solar charger build around Tim Nolans open source MPPT solar prototype project updated by Debiasish Dutta in his website, that I made a couple of changes:
Arduino code:
//ARDUINO MPPT SOLAR CHARGE CONTROLLER (Version-3) //Author: Debasish Dutta/deba168 // www.opengreenenergy.in // This code was wrote for an arduino Nano based Solar MPPT charge controller. // This code is a modified version of sample code from www.timnolan.com // updated 06/07/2015 // Adapted for Arduino Pro mini on my project on 11/2016 #include "TimerOne.h" #include "LiquidCrystal_I2C.h" #include "Wire.h" // A0 - Voltage divider (solar) // A1 - ACS 712 Out // A2 - Voltage divider (battery) // A4 - LCD SDA // A5 - LCD SCL // D5 - LCD back control button // D6 - Load Control // D8 - 2104 MOSFET driver SD // D9 - 2104 MOSFET driver IN // D11- Green LED // D12- Blue LED // D13- Red LED #define LOAD_ALGORITHM 0 #define SOL_VOLTS_CHAN 0 #define BAT_VOLTS_CHAN 1 #define SOL_AMPS_CHAN 2 #define AVG_NUM 8 #define SOL_VOLTS_SCALE 0.024900275 #define BAT_VOLTS_SCALE 0.024926075 #define SOL_AMPS_SCALE 0.024506081 #define PWM_PIN 9 #define PWM_ENABLE_PIN 8 #define PWM_FULL 1023 #define PWM_MAX 100 #define PWM_MIN 60 #define PWM_START 90 #define PWM_INC 1 #define TRUE 1 #define FALSE 0 #define ON TRUE #define OFF FALSE #define TURN_ON_MOSFETS digitalWrite(PWM_ENABLE_PIN, HIGH) #define TURN_OFF_MOSFETS digitalWrite(PWM_ENABLE_PIN, LOW) #define ONE_SECOND 50000 #define LOW_SOL_WATTS 5.00 #define MIN_SOL_WATTS 1.00 #define MIN_BAT_VOLTS 11.00 #define MAX_BAT_VOLTS 14.10 #define BATT_FLOAT 13.60 #define HIGH_BAT_VOLTS 13.00 #define LVD 11.5 #define OFF_NUM 9 #define LED_GREEN 11 #define LED_BLUE 12 #define LED_RED 13 #define LOAD_PIN 6 #define BACK_LIGHT_PIN 5 byte battery_icons[6][8]= {{ 0b01110, 0b11011, 0b10001, 0b10001, 0b10001, 0b10001, 0b11111, 0b00000, }, { 0b01110, 0b11011, 0b10001, 0b10001, 0b10001, 0b11111, 0b11111, 0b00000, }, { 0b01110, 0b11011, 0b10001, 0b10001, 0b11111, 0b11111, 0b11111, 0b00000, }, { 0b01110, 0b11011, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, }, { 0b01110, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, }, { 0b01110, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, }}; #define SOLAR_ICON 6 byte solar_icon[8] = { 0b11111, 0b10101, 0b11111, 0b10101, 0b11111, 0b10101, 0b11111, 0b00000 }; #define PWM_ICON 7 byte _PWM_icon[8]= { 0b11101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10111, 0b00000, }; byte backslash_char[8]= { 0b10000, 0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00010, 0b00000, }; float sol_amps; float sol_volts; float bat_volts; float sol_watts; float old_sol_watts = 0; unsigned int seconds = 0; unsigned int prev_seconds = 0; unsigned int interrupt_counter = 0; unsigned long time = 0; int delta = PWM_INC; int pwm = 0; int back_light_pin_State = 0; boolean load_status = false; enum charger_mode {off, on, bulk, bat_float} charger_state; LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup() { pinMode(PWM_ENABLE_PIN, OUTPUT); TURN_OFF_MOSFETS; charger_state = off; lcd.begin(20,4); lcd.backlight(); for (int batchar = 0; batchar < 6; ++batchar) { lcd.createChar(batchar, battery_icons[batchar]); } lcd.createChar(PWM_ICON,_PWM_icon); lcd.createChar(SOLAR_ICON,solar_icon); lcd.createChar('\\', backslash_char); pinMode(LED_RED, OUTPUT); pinMode(LED_GREEN, OUTPUT); pinMode(LED_BLUE, OUTPUT); Timer1.initialize(20); Timer1.pwm(PWM_PIN, 0); Timer1.attachInterrupt(callback); Serial.begin(9600); pwm = PWM_START; pinMode(BACK_LIGHT_PIN, INPUT); pinMode(LOAD_PIN,OUTPUT); digitalWrite(LOAD_PIN,LOW); digitalWrite(BACK_LIGHT_PIN,LOW); lcd.setCursor(0, 0); lcd.print("SOL"); lcd.setCursor(4, 0); lcd.write(SOLAR_ICON); lcd.setCursor(8, 0); lcd.print("BAT"); } void loop() { read_data(); run_charger(); // print_data(); load_control(); led_output(); lcd_display(); } int read_adc(int channel) { int sum = 0; int temp; int i; for (i=0; i<AVG_NUM; i++) { temp = analogRead(channel); sum += temp; delayMicroseconds(50); } return(sum / AVG_NUM); } void read_data(void) { sol_amps = (read_adc(SOL_AMPS_CHAN) * SOL_AMPS_SCALE -13.51); sol_volts = read_adc(SOL_VOLTS_CHAN) * SOL_VOLTS_SCALE; bat_volts = read_adc(BAT_VOLTS_CHAN) * BAT_VOLTS_SCALE; sol_watts = sol_amps * sol_volts ; } void callback() { if (interrupt_counter++ > ONE_SECOND) { interrupt_counter = 0; seconds++; } } void set_pwm_duty(void) { if (pwm > PWM_MAX) { pwm = PWM_MAX; } else if (pwm < PWM_MIN) { pwm = PWM_MIN; } if (pwm < PWM_MAX) { Timer1.pwm(PWM_PIN,(PWM_FULL * (long)pwm / 100), 20); } else if (pwm == PWM_MAX) { Timer1.pwm(PWM_PIN,(PWM_FULL - 1), 20); } } void run_charger(void) { static int off_count = OFF_NUM; switch (charger_state) { case on: if (sol_watts < MIN_SOL_WATTS) { charger_state = off; off_count = OFF_NUM; TURN_OFF_MOSFETS; } else if (bat_volts > (BATT_FLOAT - 0.1)) { charger_state = bat_float; } else if (sol_watts < LOW_SOL_WATTS) { pwm = PWM_MAX; set_pwm_duty(); } else { pwm = ((bat_volts * 10) / (sol_volts / 10)) + 5; charger_state = bulk; } break; case bulk: if (sol_watts < MIN_SOL_WATTS) { charger_state = off; off_count = OFF_NUM; TURN_OFF_MOSFETS; } else if (bat_volts > BATT_FLOAT) { charger_state = bat_float; } else if (sol_watts < LOW_SOL_WATTS) { charger_state = on; TURN_ON_MOSFETS; } else { if (old_sol_watts >= sol_watts) { delta = -delta; } pwm += delta; old_sol_watts = sol_watts; set_pwm_duty(); } break; case bat_float: if (sol_watts < MIN_SOL_WATTS) { charger_state = off; off_count = OFF_NUM; TURN_OFF_MOSFETS; set_pwm_duty(); } else if (bat_volts > BATT_FLOAT) { TURN_OFF_MOSFETS; pwm = PWM_MAX; set_pwm_duty(); } else if (bat_volts < BATT_FLOAT) { pwm = PWM_MAX; set_pwm_duty(); TURN_ON_MOSFETS; if (bat_volts < (BATT_FLOAT - 0.1)) { charger_state = bulk; } } break; case off: TURN_OFF_MOSFETS; if (off_count > 0) { off_count--; } else if ((bat_volts > BATT_FLOAT) && (sol_volts > bat_volts)) { charger_state = bat_float; TURN_ON_MOSFETS; } else if ((bat_volts > MIN_BAT_VOLTS) && (bat_volts < BATT_FLOAT) && (sol_volts > bat_volts)) { charger_state = bulk; TURN_ON_MOSFETS; } break; default: TURN_OFF_MOSFETS; break; } } void load_control() { #if LOAD_ALGORITHM == 0 load_on(sol_watts < MIN_SOL_WATTS && bat_volts > LVD); #else load_on(sol_watts > MIN_SOL_WATTS && bat_volts > BATT_FLOAT); #endif } void load_on(boolean new_status) { if (load_status != new_status) { load_status = new_status; digitalWrite(LOAD_PIN, new_status ? HIGH : LOW); } } void print_data(void) // you can skip this part) { Serial.print(seconds,DEC); Serial.print(" "); Serial.print("Charging = "); if (charger_state == on) Serial.print("on "); else if (charger_state == off) Serial.print("off "); else if (charger_state == bulk) Serial.print("bulk "); else if (charger_state == bat_float) Serial.print("float"); Serial.print(" "); Serial.print("pwm = "); if(charger_state == off) Serial.print(0,DEC); else Serial.print(pwm,DEC); Serial.print(" "); Serial.print("Current (panel) = "); Serial.print(sol_amps); Serial.print(" "); Serial.print("Voltage (panel) = "); Serial.print(sol_volts); Serial.print(" "); Serial.print("Power (panel) = "); Serial.print(sol_volts); Serial.print(" "); Serial.print("Battery Voltage = "); Serial.print(bat_volts); Serial.print(" "); Serial.print("\n\r"); //delay(1000); } void light_led(char pin) { static char last_lit; if (last_lit == pin) return; if (last_lit != 0) digitalWrite(last_lit, HIGH); digitalWrite(pin, LOW); last_lit = pin; } void led_output(void) { static char last_lit; if(bat_volts > 14.1 ) light_led(LED_BLUE); else if(bat_volts > 11.9) light_led(LED_GREEN); else light_led(LED_RED); } void lcd_display() { static bool current_backlight_state = -1; back_light_pin_State = digitalRead(BACK_LIGHT_PIN); if (current_backlight_state != back_light_pin_State) { current_backlight_state = back_light_pin_State; if (back_light_pin_State == HIGH) lcd.backlight(); else lcd.noBacklight(); } if (back_light_pin_State == HIGH) { time = millis(); } lcd.setCursor(0, 1); lcd.print(sol_volts); lcd.print("V "); lcd.setCursor(0, 2); lcd.print(sol_amps); lcd.print("A"); lcd.setCursor(0, 3); lcd.print(sol_watts); lcd.print("W "); lcd.setCursor(8, 1); lcd.print(bat_volts); lcd.setCursor(8,2); if (charger_state == on) lcd.print("on "); else if (charger_state == off) lcd.print("off "); else if (charger_state == bulk) lcd.print("bulk "); else if (charger_state == bat_float) { lcd.print(" "); lcd.setCursor(8,2); lcd.print("float"); } int pct = 100.0*(bat_volts - 11.3)/(12.7 - 11.3); if (pct < 0) pct = 0; else if (pct > 100) pct = 100; lcd.setCursor(12,0); lcd.print((char)(pct*5/100)); lcd.setCursor(8,3); pct = pct - (pct%10); lcd.print(pct); lcd.print("% "); lcd.setCursor(15,0); lcd.print("PWM"); lcd.setCursor(19,0); lcd.write(PWM_ICON); lcd.setCursor(15,1); lcd.print(" "); lcd.setCursor(15,1); if( charger_state == off) lcd.print(0); else lcd.print(pwm); lcd.print("% "); lcd.setCursor(15,2); lcd.print("Load"); lcd.setCursor(15,3); if (load_status) { lcd.print("On "); } else { lcd.print("Off "); } spinner(); backLight_timer(); } void backLight_timer() { if((millis() - time) <= 15000) lcd.backlight(); else lcd.noBacklight(); } void spinner(void) { static int cspinner; static char spinner_chars[] = { '*','*', '*', ' ', ' '}; cspinner++; lcd.print(spinner_chars[cspinner%sizeof(spinner_chars)]); }
And this is the final project image:
Addendum:
Paul Stoffregen’s – TimerOne.h library for Arduino
Newliquidcrystal_1.3.5.zip library for Arduino
2006 Nicholas Zambetti – Wire.h library for Arduino
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/Nicholas Zambetti – New Liquid Crystal Library
and… Done compiling!
For those who asked me about PCB Layout, I answer that for test and rapidity, I used one of these type of modules except half-bridge IR2104, buck and boost convertors which I have interconnected:
A good solution for those who need Half-Bridge IR2104 can follow this link.
Here is the conventional P&O MPPT algorithm Flowchart:
And a new added: Code Simulation on Proteus (print screen)
I have come back to this post due to the large number of requests from passionate people wanting to let you know another article published by Debasish Dutta, after a hard work that we each bring little contribution to.
This article is: here
And here repositories with contribution of Adam Plavinsto to this project:Please read carefully the coments of Keith Hungerford to this project.
I tested this code in Proteus. The code perfect matches on the existing hardware. The result is a positive one. You can use or not facilities offered by ESP8266.
And I must say once again that we are grateful to Tim Nolan.
Update 14/05/2019: code deleted to avoid confusion
Hi, I have some questions about this project. May I ask your e-mail address so that I won’t make mess in the comment section.
Please ask your questions here. Maybe others are interested in these answers.
I noticed that one of 100uF capacitor you used is low ESR. So, am I suppose to use aluminum electrolytic capacitor? Also, is it necessary to use exactly same part? For example, using 0.22uF/35V capacitor instead of 0.22uF/100V.
100uF can be aluminum too but try to put LOW ESR if you can get one.
its OK 0.22uF/100V.
Hello, I am planning to make mppt solar charger myself. I would like to get some quick feedback while making it. Could you tell me how to get in touch with me quickly or can you tell me your e-mail address? Thank you.
Please ask your questions here. Maybe others are interested in these answers.
Hello
I want to know some of the principles of circuit.
1. I connected pins 5 and 6 from c1 acs712 to ground in parallel. Is it to prevent over-current?
2. Is the reason for using r3r4 also to prevent over-current flow?
3. I understand that the reason for using r1 and r2 is to distribute voltage. But why is c1 connected in parallel with r2?
4. Why c2,c3 was used in parallel and why 1n5819 was used
Also, I wonder why you used c4 in series.
5. Assume r5, r6 as over-current protection. But why is the 1k resistance next to it connected to the ground?
6. I think c5 was used as a filter. Why did you use a filter?
7. I wonder how it works in the circuit of irf520 q1,q2.
8. Lastly, please explain the principle of parallel l3 and parallel d7 of parallel l3 are connected in series.
I still had a lot of questions about the principle because I still lacked a lot. There seems to be a lot of basic things, but I’m sorry that I have a lot of questions. Please answer all of them.
Hello, I have one more question!
I wonder why 18v is in the ir2104 vcc part.
If you look at the other circuits, you can see circuits using 5v.
Thank you.
Hi, Asmlektor i am planning to do this project, Actually my question is what are changes has to be made if my panel rated voltage is 48V and i need output of 48V, 10A-20A output.
Can i connect panel of 12v,18v, 24v, 48v and i need output voltage upto 48V, 20A current.
please let me know the changes to be made.
Thanks
With a 48 v panel you will never be able to get 48 v at the output. You have to think about inserting several panels. I understand that your installation is large, so you need specialized consultation and probably industrial equipment.
Hello Asmlektor, I like this project and i want to design this project. Actually thanks to you and
Panel – 250W, Voc – 70V, Isc – 6A
what are the major changes i should do in the above circuit. plz let me know
thanks
OK you must change values fom lines 50 to 54 to characteristics suitable to your batteries.
You must put a powerful core for L3 for more courent with the same value (33 uH).
Put another ACS712, next one is for 30 Amps.
Of corse MOSFET transistors suitable for minimum 100 Volts and 10-20 Amps (maybe more in paralel) on a good heatsink.
Of corse these are at a first approximation.Some calculations need to be done
Hi. I tested the Diagram.
But there have been many problems.
When input of 18v 1a is given with the first dc supply, the voltage is displayed correctly, but the current is output as -. For example, -2.97a also has no pwm percent output on lcd. Our battery voltage is 12.65v. Is the pwm not working properly because it is high in our battery voltage? How can I properly mark the current value? I referred to your acs712 post. Please help me.
The Hall current sensor ACS712 on my opinion is not a good choice for current measurements, verry sensible to electromagnetic field, hard to calibrate, instability. Be careful to input and output connector pin of ACS712. Vith “-2.97A ” displayed on LCD can be an explanation or not.
Try understand the chip function following indication on my post.
No PWM to output can occure from many reasons. This project has more complexity and is not “working” from the first try. But finaly is OK. Many people finished with success. Take a look on Youtube
Hello, I tried your circuit diagram and link Youtube circuit. But neither current was flowing, and even when measured with a multimeter, it doesn’t flow… I’m really curious…I wonder why the current doesn’t flow from the sensor part… Acs712 sensor, ir2104, and the voltage divider Buck Converter were tested separately, but they all worked. However, if i make a complete circuit, the overall current will not flow. I really don’t know. Please help me for some reason.
Its hard to give an answer to this question. As I aswered to Bach Nguyen on my site, you need to know if you have any pulses on the outputs of IR2104. I used an osciloscope to see the pulses. Of corse there must be created voltage conditions (battery and solar pannel) to have that pulses. I created and used an simulation circuit to verify Arduino responses to all that, that you can see on Q&A on the post, and i verify the functionality of ACS function of ACS712 on Arduino test circuit, separately. You can’t fail. Keep in touch.
Dear, Can use use with 24v Battery system? kindly update, plz let me know
thanks
This question was asked to me several times and I answered in the comments.
Yes it is possible to charge 24 Volt batteries. For this, some changes must be made in the code, but also the use of solar panels to supply a voltage higher than 24 volts at the output.
Hi, What happened to the V2 version of this controller, the page no longer exists https://microcontrolere.wordpress.com/2019/05/22/mppt-charger-ver-2/ did you find a problem with it? Thanks Anthony
For some unknown reasons the link was dissapeared. I put it the page back! Now is OK Remember: the code is compatible with the hardware as presented in the previous version.
Hi Asmlektor,
What happened to the V2 version of this controller, the page no longer exists https://microcontrolere.wordpress.com/2019/05/22/mppt-charger-ver-2/
did you find a problem with it?
Thanks Teguh
try again this link:https://microcontrolere.wordpress.com/2019/05/22/mppt-charger-ver-2/
Try again this link
What is the difference if I want to use this controller for a 325W solar panel
I think you speak about solar pannels rated as Maximum Power Voltage-VMp 29.4 V and Maximum Power Currrent-IMpp (A) 7.66. In that case you can use that pannel to charge 24 volts batteries and some code changes need to be made as I responded to other readers in my comments.
Hello. I want to know value of switching frequency that you use in circuit, is it 50 kHz?
Thank you.
You could see the pictures in this post “The waveforms are for 5V/div amplitude and 5 us/div timebase”. An arduino runns at 16MHz gives us a maximum PWM frequency of 62.5kHz. The main reason of using higher and higher switching frequencies is size. The higher the frequency, the smaller the inductor can be.
excuseme, i wanna ask you about the circuit in your proteus schematic, why you choose the mosfet driver IR2112 ? Actually you said in your this articel that using IR2014,
I did this because at that time I could not find that device ( IR2104) in the prroteus library.I only did the simulation because some readers asked me to.
does this circuit really work? no magic happened in your youtube video? im having trouble with the actual hardware..already burned 3 arduino nano, 2 acs758 lcb 50Amp and 4 mosfets.. its making my head turn
same code, just tweaked the scaling numbers for solar amps ,solar voltage, bat voltage..
12volts system.. but my solar panel has an output voltage of 41volts(also change the voltage divider to suffice the 5volts output) and 800watts..
I’m sorry to hear that, but there are definitely some mistakes in understanding or executing this project.
Hello sir i want schematic for this please sir
Sir the schematic diagram is that you can see in the page. If you need more information please ask me.
Hello sir, i try compile the code but it show up error TimerOne.h: No such file or directory, i have download PaulStoffregen/TimerOne and install library. but am having the same problem. please i need your help. Thank you.
I worked on this sketch a long time ago.
I also changed the version of the libraries and the Arduino IDE.
I am now at IDE Arduino 1.6.12. version and for the library I checked this one: TimerOne-1.1.0 from this link.
But it’s probably not enough. Try to make some changes:
-Try to change like this:
Enter a new line below line 10:
#include “LiquidCrystal_I2C.h”
Below setup() line enter a new line, like this:
LiquidCrystal_I2C lcd(0x27, 16, 2);
With these changes the published code compiles perfectly without errors
Let me know if there are any problems.
Could this be used to open and close a relay to stop battery charging?
I have a very old generator which puts out 32V dc “unloaded”. This is crudely turned into a 12V battery charging circuit via a giant current limiting resistor, but over time since there is nothing to stop battery charging as the battery approaches full the voltage will climb back towards 32V and whatever amperage goes through it and boils the battery. Its a very crude system.
Looking to build something like this to run a relay to open the charging circuit from the battery to prevent boiling/overcharging during long run times.
No. This circuit is not suitable for your battery protection. You need a battery charging circuit with overvoltage protection and/or current limiting. This circuit is not hard to find and build. Instead of “giant current limiting resistor” a cheap solution is to use a incandescent bulb 24V/40W. Sorry for delayed response.
Dear Sir. what do i need to change to use 80 volts solar cell with 20 amps to charge 12 volt and 24 volt batteries. Please…
Having such a powerful solar battery system, I would recommend using all the power of this solar system to charge more batteries mounted in series and parallel, to provide more power to a 230VAC converter.
i need the proteus file please
I rarely do simulations in Proteus. This was done at the request of my readers. This project was completed a long time ago and I have not kept any documents related to it. I`m sorry about that.
Hi. I need some help with the coil. The coil heating to 45Āŗ with 0.3-0.5A curent consumtion. Anyway, how you calculate 33uH at 50kHz ?
I can’t download Google drive file.
Please help me.
Just copy the code from page with Control&C and paste-it with Control&V on your Arduino IDE program.
Sir,
I am new to Arduino. I just uploaded your code. For the first time I could not. After I deleted last items of few lines regarding spinner. Now the code uploaded successfully. But it’s not displayed on LCD. Some other mppt programs are running on LCD. But Codes by Debasis Datta’s including yours are not displayed on LCD, inspite of uploaded successfully. Please help me.
Thanking you sir
You right. For short. LCD library versions are in incompatibility state with LCD old librares.
Look carefuly to this two lines:
#include “LiquidCrystal_I2C.h”
#include “Wire.h”
This are libraries and for some reason Arduino IDE versions under 1.5.5 no longer works.
First please delete old LCD library and change it with this new one: LiquidCrystal_V1.2.1.zip (485 KB).
This is the link: https://forum.arduino.cc/uploads/short-url/9W176kpsq6JIBAYAoUsy4mv4MZ0.zip
Sketch will compile.
Verified: LiquidCrystal_V1.2.1 library with Arduino IDE v1.8.1
Please give me a feedback.
Thank you sir, I done it.