#include <SPI.h>
#include <MFRC522.h>
#include <Arduino_FreeRTOS.h>
#include <queue.h>
#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define NEJVETSI_BOD 30
#define NEJMENSI_BOD -10
OneWire oneWire(A0);
DallasTemperature tepSenzor(&oneWire);
QueueHandle_t fronta;
MFRC522 rfid(10, 9);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
// stavy:
// 0 - vypnuto (defaultne)
// 1 - uvitani
// 2 - teplota v celsiu
// 3 - teplota ve fahrenheitu
void RFIDKontrola(void *pvParameters);
void LCDATlacitka(void *pvParameters);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
tepSenzor.begin();
pinMode(8, INPUT_PULLUP);
pinMode(A5, INPUT_PULLUP);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
fronta = xQueueCreate(4, sizeof(int));
xTaskCreate(RFIDKontrola, "TaskRFIDKontrola", 128, NULL, 2, NULL);
xTaskCreate(LCDATlacitka, "TaskLCDATlacitka", 128, NULL, 1, NULL);
}
void loop() {
}
void LCDATlacitka(void *pvParameters) {
lcd.begin(16, 2);
int stav = 0;
int predchoziStavTep = HIGH;
int predchoziStavExit = HIGH;
float aktualniTeplota = 0.0;
while (1) {
if (xQueueReceive(fronta, &stav, 0) == pdPASS) {
if (stav == 0) {
lcd.clear();
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
}
else if (stav == 1) {
lcd.clear();
lcd.print(F("Vitejte!"));
digitalWrite(A2, LOW);
}
else if (stav > 1) {
if (aktualniTeplota > NEJVETSI_BOD || aktualniTeplota < NEJMENSI_BOD) {
digitalWrite(A1, LOW);
digitalWrite(A2, HIGH);
} else {
digitalWrite(A1, HIGH);
digitalWrite(A2, LOW);
}
if (stav == 2) {
lcd.clear();
lcd.print("Tep. Celsius:");
lcd.setCursor(0, 1);
lcd.print(aktualniTeplota);
lcd.print(" C");
} else if (stav == 3) {
lcd.clear();
lcd.print("Tep. Fahrenheit:");
lcd.setCursor(0, 1);
float tempF = tepSenzor.toFahrenheit(aktualniTeplota);
lcd.print(tempF);
lcd.print(" F");
}
}
}
int nactenyStavTep = digitalRead(8);
int nactenyStavExit = digitalRead(A5);
if (nactenyStavExit == LOW && predchoziStavExit == HIGH) {
stav = 0;
xQueueSend(fronta, &stav, 0);
vTaskDelay(150 / portTICK_PERIOD_MS);
}
if (nactenyStavTep == LOW && predchoziStavTep == HIGH && stav > 0) {
tepSenzor.requestTemperatures();
aktualniTeplota = tepSenzor.getTempCByIndex(0);
if (stav == 2) {
stav = 3;
} else {
stav = 2;
}
xQueueSend(fronta, &stav, 0);
vTaskDelay(150 / portTICK_PERIOD_MS);
}
predchoziStavTep = nactenyStavTep;
predchoziStavExit = nactenyStavExit;
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void RFIDKontrola(void *pvParameters) {
SPI.begin(); // zahajit protokol/komunikace pro transfer dat
rfid.PCD_Init(); // zapnuti ctecky
while (1) {
if (!rfid.PICC_IsNewCardPresent()) { // kontrola, zda karta je na ctecce
vTaskDelay(500 / portTICK_PERIOD_MS);
continue;
}
if (!rfid.PICC_ReadCardSerial()) { // kontrola, zda mohu precist uid karty
vTaskDelay(500 / portTICK_PERIOD_MS);
continue;
}
if (rfid.uid.uidByte[0] != 0x55) { // zde dovoluji jen zlutou kartu (uid 55 66 77 88)
continue;
}
if (rfid.uid.uidByte[1] != 0x66) {
continue;
}
if (rfid.uid.uidByte[2] != 0x77) {
continue;
}
if (rfid.uid.uidByte[3] != 0x88) {
continue;
}
int stav = 1;
xQueueSend(fronta, &stav, 0);
rfid.PICC_HaltA(); // aby napsalo existenci zlute karty jen jednou (posle ctec do spanku)
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}