#include <Arduino_FreeRTOS.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;
const int pot=A4;
const int led=A2;
int nilaipot=0;
int kode;
int trigPin = 6;
int echoPin = 7;
long waktu;
int jarak;
int nilai=0;
int posisi;
int Buzzer=11;
const int interruptPin = 2;
int nilaistate=1;
void TaskPOT(void *pvParameters);
void TaskLED(void *pvParameters);
void TaskULTRA(void *pvParameters);
void TaskSERVO(void *pvParameters);
void TaskBUZZER(void *pvParameters);
void TaskLCD(void *pvParameters);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
myservo.attach(A3);
xTaskCreate( TaskPOT, "POT", 128, NULL, 4, NULL);
xTaskCreate( TaskLED, "LED", 128, NULL, 2, NULL);
xTaskCreate( TaskULTRA, "ULTRA", 128, NULL, 3, NULL);
xTaskCreate( TaskSERVO, "SERVO", 128, NULL, 3, NULL);
xTaskCreate( TaskBUZZER, "BUZZER", 128, NULL, 2, NULL);
xTaskCreate( TaskLCD, "LCD", 128, NULL, 5, NULL);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);
}
void loop() {
}
void TaskPOT(void *pvParameters) {
(void) pvParameters;
pinMode(pot, INPUT);
for (;;)
{
nilai=analogRead(pot);
Serial.print("Nilai Potensio: ");
nilaipot = map(nilai, 0, 1023, 0, 300);
Serial.println(nilaipot);
if(nilaipot<=150){
kode=0;
}
else if(nilaipot>150){
kode=1;
}
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void TaskLED (void *pvParameters) {
(void) pvParameters;
pinMode(led, OUTPUT);
for (;;)
{
analogWrite(A2,nilaipot);
}
}
void TaskULTRA (void *pvParameters) {
(void) pvParameters;
pinMode(6, OUTPUT);
pinMode(7, INPUT);
for (;;)
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
waktu = pulseIn(echoPin, HIGH);
jarak= waktu*0.034/2;
Serial.print("Nilai Ultrasonik: ");
Serial.println(jarak);
posisi = map(jarak, 0, 265, 0, 180);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void TaskSERVO (void *pvParameters) {
(void) pvParameters;
for (;;)
{
myservo.write(posisi);
Serial.print("Sudut Servo: ");
Serial.println(posisi);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void TaskBUZZER (void *pvParameters) {
(void) pvParameters;
pinMode (Buzzer,OUTPUT);
for (;;)
{
if(kode==1){
tone(Buzzer,450);
Serial.println("Buzzer Hidup");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
else if(kode==0){
noTone(Buzzer);
Serial.println("Buzzer Mati");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
}
void blink() {
nilaistate++;
if(nilaistate>5) nilaistate=1;
}
void TaskLCD (void *pvParameters) {
(void) pvParameters;
for(;;){
if(nilaistate==1){
lcd.setCursor(0, 0);
lcd.print("Nilai Potensio:");
lcd.setCursor(0, 1);
lcd.print(nilaipot);
}
else if(nilaistate==2){
if(kode==1){
lcd.setCursor(0, 0);
lcd.print("Led Hidup");
lcd.setCursor(0, 1);
lcd.print("Kecerahan : ");
lcd.print(nilaipot);
}
else if(kode==0){
lcd.setCursor(0, 0);
lcd.print("Led Mati");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
else if (nilaistate==3){
lcd.setCursor(0, 0);
lcd.print("Nilai Ultrasonik:");
lcd.setCursor(0, 1);
lcd.print(jarak);
}
else if (nilaistate==4){
lcd.setCursor(0, 0);
lcd.print("Sudut Servo:");
lcd.setCursor(0, 1);
lcd.print(posisi);
}
else if(nilaistate==5){
if(kode==1){
lcd.setCursor(0, 0);
lcd.print("Buzzer Hidup");
}
else if(kode==0){
lcd.setCursor(0, 0);
lcd.print("Buzzer Mati");
}
}
vTaskDelay(100);
lcd.clear();
}
}