//library LCD
#include <LiquidCrystal.h>
//Ultrasonik
#define TRIGIPIN 11
#define ECHOPIN 12
//library servo
#include <Servo.h>
//pin LCD
LiquidCrystal lcd(33, 31, 29, 27, 25, 23);
//variabel servo
Servo myservo;
//pin PB
const int pb_sistem = 2;
const int pb_conveyor = 3;
const int sensor = 13;
const int pb_suhu = 8;
//PIN SENSOR LM35
const int lm35 = A0;
byte cdegree[8] = {
0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000
};
int adc, temp, setPoint;
byte f_origin;
//pin servo
int servo = 24;
//pin relay
const int relay_sensor = 39;
const int relay_conveyor = 37;
const int relay_sistem = 35;
//pin buzzer
const int buzzer = 45;
//variabel-variabel
int sensorSuhu = 0;
int pb_conveyorState = 0;
unsigned int distance, timer;
//DOT MATRIX
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define USE_UI_CONTROL 0
#if USE_UI_CONTROL
#include <MD_UISwitch.h>
#endif
#define DEBUG 0
#if DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#endif
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 52
#define DATA_PIN 51
#define CS_PIN 53
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
#if USE_UI_CONTROL
const uint8_t SPEED_IN = A5;
const uint8_t DIRECTION_SET = 8;
const uint8_t INVERT_SET = 9;
const uint8_t SPEED_DEADBAND = 5;
#endif
uint8_t scrollSpeed = 50;
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 0;
#define BUF_SIZE 75
char curMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "WELCOME" };
bool newMessageAvailable = true;
const int pb3 = 4;
int pb3State = 0;
int dotmatrixrunning = 0;
#if USE_UI_CONTROL
MD_UISwitch_Digital uiDirection(DIRECTION_SET);
MD_UISwitch_Digital uiInvert(INVERT_SET);
void doUI(void)
{
{
int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150);
if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
(speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
{
P.setSpeed(speed);
scrollSpeed = speed;
PRINT("\nChanged speed to ", P.getSpeed());
}
}
if (uiDirection.read() == MD_UISwitch::KEY_PRESS)
{
PRINTS("\nChanging scroll direction");
scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
P.setTextEffect(scrollEffect, scrollEffect);
P.displayClear();
P.displayReset();
}
if (uiInvert.read() == MD_UISwitch::KEY_PRESS)
{
PRINTS("\nChanging invert mode");
P.setInvert(!P.getInvert());
}
}
#endif
void readSerial(void)
{
static char *cp = newMessage;
while (Serial.available())
{
*cp = (char)Serial.read();
if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE - 2))
{
*cp = '\0';
cp = newMessage;
newMessageAvailable = true;
}
else
cp++;
}
}
void setup() {
Serial.begin(9600);
lcd.begin (16, 2);
//SETUP PB
pinMode(pb_sistem, INPUT_PULLUP);
pinMode(pb_conveyor, INPUT_PULLUP);
pinMode(sensor, INPUT_PULLUP);
pinMode(pb_suhu, INPUT_PULLUP);
//SETUP RELAY
pinMode(relay_sensor, OUTPUT);
pinMode(relay_sistem, OUTPUT);
pinMode(relay_conveyor, OUTPUT);
//SETUP ULTRASONIK
pinMode(ECHOPIN, INPUT);
pinMode(TRIGIPIN, OUTPUT);
//SETUP BUZZER
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer, LOW);
// SETUP SERVO
myservo.attach(servo);
myservo.write(90);
//SETUP SETPOINT
setPoint = 40;
#if USE_UI_CONTROL
uiDirection.begin();
uiInvert.begin();
pinMode(SPEED_IN, INPUT);
doUI();
#endif
P.begin();
P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
Serial.print(temp);
}
void loop() {
digitalWrite(TRIGIPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGIPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGIPIN, LOW);
timer = pulseIn(ECHOPIN, HIGH);
distance = timer / 58;
adc = analogRead(lm35);
temp = (adc * 5) / 10;
//MEMULAI SISTEM
if (digitalRead(sensor) == 0) {
sensorSuhu++;
digitalWrite(relay_sensor, HIGH);
digitalWrite(relay_sistem, HIGH);
digitalWrite(relay_conveyor, HIGH);
lcd.setCursor(0, 0);
lcd.print("Sistem Dimulai");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Mohon Tunggu");
lcd.setCursor(13, 1);
lcd.print(".");
delay(200);
lcd.setCursor(14, 1);
lcd.print(".");
delay(200);
lcd.setCursor(15, 1);
lcd.print(".");
delay(200);
lcd.setCursor(16, 1);
lcd.print(".");
delay(200);
lcd.clear();
}
switch(sensorSuhu){
case 1 :
lcd.setCursor(0, 0);
lcd.print("Suhu saat ini =");
lcd.setCursor(0, 1);
lcd.print(temp);
lcd.setCursor(3, 1);
lcd.print("C");
break;
default:
break;
}
//STARTING LCD & DOT MATRIX
if (digitalRead(relay_sistem) == HIGH && digitalRead(pb_sistem) == LOW) {
dotmatrixrunning++;
if (dotmatrixrunning > 1) {
dotmatrixrunning = 1;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tekan PB 3");
lcd.setCursor(0, 1);
lcd.print("Memulai Conveyor");
delay(2000);
lcd.clear();
}
//STARTING TO MEASURE
if (digitalRead(relay_conveyor) == HIGH && digitalRead(pb_conveyor) == LOW) {
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
pb_conveyorState++;
if (pb_conveyorState > 1) {
pb_conveyorState = 1;
}
}
switch (pb_conveyorState) {
case 1 :
lcd.setCursor(0, 0);
lcd.print("Tinggi=");
lcd.setCursor(8, 0);
lcd.print(distance);
lcd.setCursor(12, 0);
lcd.print("cm");
if (distance <= 50) {
myservo.write(45);
lcd.setCursor(0 , 1);
lcd.print("Masuk Gerbang 1");
delay(1000);
}
else {
myservo.write(135);
lcd.setCursor(0 , 1);
lcd.print("Masuk Gerbang 2");
delay(1000);
}
lcd.clear();
delay(10);
break;
}
switch (dotmatrixrunning) {
case 1:
if (P.displayAnimate()) {
if (newMessageAvailable) {
strcpy(curMessage, newMessage);
newMessageAvailable = false;
}
P.displayReset();
}
readSerial();
break;
}
}