/*****************************************
Microcontroller Application
Project: liquid level control system
Date: 19.10.2020
****************************************/
/* I/O Assignment */
#define STCP 4 // Clock for Storage
#define SHCP 7 // Clock for Shift data
#define DS 8 // Shift Data
#define POT1 0 // Analog input AD0
#define SV1 12 // Solinoid valve 1
#define SV2 11 // Solinoid valve 2
#define LH 13 // High Level
#define LL 10 // LOW Level
/* TANK Parameter */
int TANK_high = 100;
int HIGH_level = 100;
int LOW_level = 25;
int HIGH_alarm = 90;
int L1 = 25;
int L2 = 50;
int L3 = 75;
int L4 = 100;
int LOW_alarm = 25;
/*----------------------*/
int AD_Value; // The A/D raw value(0-1023)
int TRUE_Value; // Scaling Value (0-100)
int Time; // time for display
int SEG_DAT[4]; // Segment Data map 4 digit
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] =
{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};
/* Byte maps to select digit 1 to 4 */
const byte DIGIT_MAP[] = {0xF0, 0xF8, 0xF4, 0xF2, 0xF1};
void setup ()
{
/* Set DIO pins to outputs */
pinMode(STCP, OUTPUT); // IO4->STCP
pinMode(SHCP, OUTPUT); // IO7->SHCP
pinMode(DS, OUTPUT); // IO8->DS
pinMode(SV1, OUTPUT); // IO12->SV1
pinMode(SV2, OUTPUT); // IO11->SV2
pinMode(LH, OUTPUT); // IO13->LH
pinMode(LL, OUTPUT); // IO10->LL
pinMode(A0, INPUT);
digitalWrite(SV1, HIGH);
digitalWrite(SV2, HIGH);
digitalWrite(LH, HIGH);
digitalWrite(LL, HIGH);
}
/********* Main program ******************/
void loop()
{
/**** Get TANK Level ****/
TRUE_Value = read_ad(0, TANK_high);
process(); // Process Controller
//alarm_high(); // High Alarm Service
//alarm_low(); // Low Alarm Service
show_level(); // Display Level on 7-Segment
}
/* READ Analog Input */
int read_ad(int smin, int smax)
{
int cal_value;
AD_Value = analogRead(POT1);
return map(AD_Value, 0, 1023, smin, smax);
}
void process(void)
{
if(TRUE_Value >= L4){
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
}else if(TRUE_Value < L4 && TRUE_Value >= L3){
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
}else if(TRUE_Value < L3 && TRUE_Value >= L2){
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
}else if(TRUE_Value < L2 && TRUE_Value >= L1){
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
}
/*
if (TRUE_Value > LOW_level && TRUE_Value <
HIGH_level)
{
digitalWrite(SV1, LOW);
digitalWrite(SV2, LOW);
digitalWrite(LL, HIGH);
digitalWrite(LH, HIGH);
}
else if (TRUE_Value <= LOW_level)
{
digitalWrite(SV1, LOW);
digitalWrite(SV2, HIGH);
digitalWrite(LL, LOW);
digitalWrite(LH, HIGH);
}
else if (TRUE_Value >= HIGH_level)
{
digitalWrite(SV1, HIGH);
digitalWrite(SV2, LOW);
digitalWrite(LL, HIGH);
digitalWrite(LH, LOW);
}
*/
}
void alarm_high(void)
{
while (TRUE_Value >= HIGH_alarm)
{
digitalWrite(SV1, HIGH);
digitalWrite(SV2, HIGH);
digitalWrite(LL, HIGH);
digitalWrite(LH, HIGH); //Blink
alarm_dis();
digitalWrite(LH, LOW); //Blink
alarm_dis();
TRUE_Value = read_ad(0, TANK_high);
}
}
/* Custom Function Display "----" */
/* Segment_val = 0xdf :: segment g */
/* digit_Val = 0x0F :: 4 digit */
void alarm_dis(void)
{
digitalWrite(STCP, LOW);
shiftOut(DS, SHCP, MSBFIRST, 0xBF);
shiftOut(DS, SHCP, MSBFIRST, 0x0F);
digitalWrite(STCP, HIGH);
delay(1000);
}
/* Custom Function Display 1 digit */
void dis7Segment(byte Segment_val, byte digit_Val)
{
digitalWrite(STCP, LOW);
shiftOut(DS, SHCP, MSBFIRST,
SEGMENT_MAP[Segment_val]);
shiftOut(DS, SHCP, MSBFIRST, DIGIT_MAP[digit_Val]
);
digitalWrite(STCP, HIGH);
}
/* Convert Decimal with point and Zero blank */
void num2seg(int value, int point)
{
SEG_DAT[4] = SEGMENT_MAP[value / 1000];
SEG_DAT[3] = SEGMENT_MAP[(value / 100) % 10];
SEG_DAT[2] = SEGMENT_MAP[(value / 10) % 10];
SEG_DAT[1] = SEGMENT_MAP[value % 10];
/* Decimal Point Adding*/
switch (point) {
case 1:
SEG_DAT[2] &= 0x7F;
break;
case 2:
SEG_DAT[3] &= 0x7F;
break;
case 3:
SEG_DAT[4] &= 0x7F;
break;
}
/* Leading ZERO Blank */
if (value < 100 )
{
SEG_DAT[3] = 0xFF;
SEG_DAT[4] = 0xFF;
}
else if (value < 1000 )
{
SEG_DAT[4] = 0xFF;
}
}
void alarm_low(void)
{
while (TRUE_Value <= LOW_alarm)
{
digitalWrite(SV1, HIGH);
digitalWrite(SV2, HIGH);
digitalWrite(LL, HIGH);
digitalWrite(LH, HIGH); //Blink
alarm_dis();
digitalWrite(LL, LOW); //Blink
alarm_dis();
TRUE_Value = read_ad(0, TANK_high);
}
}
/* Display 7 Segment 4 digit 1 time */
void dis1time(int dis_time)
{
for (int i = 1; i <= 4; i++)
{
digitalWrite(STCP, LOW);
shiftOut(DS, SHCP, MSBFIRST, SEG_DAT[i]);
shiftOut(DS, SHCP, MSBFIRST, DIGIT_MAP[i] );
digitalWrite(STCP, HIGH);
delay(dis_time);
}
}
/* Show LEVEL 7 Segment */
void show_level(void)
{
for (int i = 0; i <= 25; i++)
{
num2seg(TRUE_Value, 0);
dis1time(1);
}
}