Összeraktam test asztalon ezt a "csodát". Számomra legalább is csoda, már csak azért is mert most foglalkozom először arduinoval meg úgy magában ilyen formában az AVR-el. Azért osztom meg veletek a tapasztalataimat mert véleményekre vagyok kíváncsi. Tapasztaltabbak tanácsaira, figyelmeztetéseire.
A "csoda" lényege.
Tartalmaz egy kapcsolót, hőmérőt, státusz ledet (rgb), relét, buzzert
A relé: egy motor van rajta amin légtérbe beáramló levegőt kapcsolom
Kapcsoló: a kézi be/ki kapcsoláshoz kell
Hőmérő: a légtér hőmérsékletét mérem
Buzzer: sípol ha túlmelegedés van
Az arduino mellé kiraktam egy raspberry pi 2-t is amin a serial kimenetet mentem adatbázisba időbélyeggel ellátva így vissza tudom tekinteni bármikor az adatokat
Maga a rendszer megfelelően működik.
Előre is köszönöm a véleményeket, kritikákat.
A code:
Kód: Egész kijelölése
// Pinek
const int PIN_BUTTON = 2;
const int PIN_LED_RED = 3;
const int PIN_LED_BLUE = 5;
const int PIN_LED_GREEN = 6;
const int PIN_CONTROLLER = 9;
const int PIN_BUZZER = 11;
const int PIN_TEMPERATURE = 14;
// Motor statuszok
const byte ENGINE_OFF = 0;
const byte ENGINE_ON = 1;
// Eszkoz statuszok
const byte DEVICE_OFF = 0;
const byte DEVICE_ON = 1;
// Gomb statuszok
const byte BUTTON_UP = 0;
const byte BUTTON_DOWN = 1;
const int DEVICE_OVERHEATED_BUZZER_TIME = 200; // Tulhevult bekapcsolt eszkoz sipolas hossza
const int DEVICE_OVERHEATED_BUZZER_DELAY = 50; // Tulhevult bekapcsolt eszkoz sipolas szuneteltetesenek hossza
const float TEMPERATURE_LIMIT = 40.00; // Hofok ertek limit
byte device_status = DEVICE_ON; // Eszkoz aktualis statuszterteke
boolean device_overheated = false; // Eszkoz tul van-e melegedve
/**
* Buzzer vezerlese.
*
* @param char time - Sipolas hossza (ms)
* @param char dly - Varakozas (ms)
*/
void beep(char time, char dly)
{
analogWrite(PIN_BUZZER, time);
delay(dly / 2);
analogWrite(PIN_BUZZER, 0);
delay(dly / 2);
}
/**
* LED vezerlese (RGB).
*
* @param int red - Piros szin (0-255)
* @param int green - Zold szin (0-255)
* @param int blue - Kek szin (0-255)
*/
void setLEDColor(int red, int green, int blue)
{
#ifdef COMMON_ANODE
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
#endif
analogWrite(PIN_LED_RED, red); // Piros szin vezerlese
analogWrite(PIN_LED_GREEN, green); // Zold szin vezerlese
analogWrite(PIN_LED_BLUE, blue); // Kek szin vezerlese
}
/**
* Visszater az eszkoz homersekletevel.
*/
float getDeviceTemperature()
{
int temperature_voltage = analogRead(PIN_TEMPERATURE); // Hofok feszultsegertek lekerdezese
return (((temperature_voltage / (float)1024) * 5000) / 10 - 273.15); // Hofok (Celsius)
}
/**
* Igazzal ter vissza ha az eszkoz tul van melegedve.
*/
boolean isDeviceOverheated()
{
return device_overheated;
}
/**
* Visszater a bekapcsolo gomb statuszaval.
*/
byte getButtonStatus()
{
return (digitalRead(PIN_BUTTON) == LOW ? BUTTON_DOWN : BUTTON_UP);
}
/**
* Visszater a motor statuszaval.
*/
byte getEngineStatus()
{
return (digitalRead(PIN_CONTROLLER) == HIGH ? ENGINE_ON : ENGINE_OFF);
}
/**
* Motor vezerlese.
*/
void setEngineStatus(byte status)
{
// Motor statuszanak megvaltoztatasa csak
// akkor, ha az nem egyenlo az elozo ertekkel.
if (getEngineStatus() != status) {
switch(status)
{
// Motor bekapcsolasa
case ENGINE_ON:
digitalWrite(PIN_CONTROLLER, HIGH);
break;
// Motor kikapcsolasa
case ENGINE_OFF:
digitalWrite(PIN_CONTROLLER, LOW);
break;
}
}
}
/**
* Visszater az eszkoz statuszaval.
*/
byte getDeviceStatus()
{
return device_status;
}
/**
* Eszkoz vezerlese.
*/
void setDeviceStatus(byte status)
{
switch(status)
{
// Eszkoz bekapcsolasa
case DEVICE_ON:
// Eszkoz bekapcsolasa, ha az nincs tulmelegedve
if(isDeviceOverheated() == false) {
setLEDColor(0, 255, 0); // zold LED jelzes
setEngineStatus(ENGINE_ON); // Motor bekapcsolasa
}
break;
// Eszkoz kikapcsolasa (STANDBY)
case DEVICE_OFF:
setLEDColor(0, 0, 255); // kek LED jelzes
setEngineStatus(ENGINE_OFF); // Motor lekapcsolasa
break;
}
device_status = status; // Aktualis statuszertek beallitasa
}
// MAIN
void setup()
{
// PIN labak beallitasa
pinMode(PIN_BUTTON, INPUT);
pinMode(PIN_CONTROLLER, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_LED_RED, OUTPUT);
pinMode(PIN_LED_BLUE, OUTPUT);
pinMode(PIN_LED_GREEN, OUTPUT);
// Ellenalas beallitasa
digitalWrite(PIN_BUTTON, HIGH);
digitalWrite(PIN_CONTROLLER, HIGH);
// Eszkoz alapertekenek beallitasa
setDeviceStatus(getDeviceStatus());
// Serial elinditasa
Serial.begin(9600);
}
// LOOP
/**
* LED STATUSZOK:
* ---------------------------------
*
* - PIROS + SIPOLAS: Az ESZKOZ BE van kapcsolva es a MOTOR TUL VAN MELEGEDVE.
* - PIROS: Az ESZKOZ KI van kapcsolva es a MOTOR TUL VAN MELEGEDVE.
* - ZOLD: Az ESZKOZ es a MOTOR BE van kapcsolva.
* - KEK: Az ESZKOZ es a MOTOR KI van kapcsolva (STANDBY).
*
*/
void loop()
{
// Az eszkoz tulmelegedett
if (getDeviceTemperature() >= TEMPERATURE_LIMIT) {
device_overheated = true;
// Tulmelegedes jelzese sipolassal, ha az be van kapcsolva
if (getDeviceStatus() == DEVICE_ON) {
beep(DEVICE_OVERHEATED_BUZZER_TIME, DEVICE_OVERHEATED_BUZZER_DELAY);
}
setLEDColor(255, 0, 0); // piros LED jelzes
setEngineStatus(ENGINE_OFF); // Motor lekapcsolasa
} // Az eszkoz lehult, aktualis allapot folytatasa
else if (isDeviceOverheated() == true) {
device_overheated = false;
setDeviceStatus(getDeviceStatus());
}
// Gomblenyomas ellenorzese
if (getButtonStatus() == BUTTON_DOWN) {
setDeviceStatus(getDeviceStatus() == DEVICE_OFF ? DEVICE_ON : DEVICE_OFF);
}
// Log
Serial.print("Status: ");
Serial.print((int)getDeviceStatus());
Serial.print(" (Temperature: ");
Serial.print(getDeviceTemperature());
Serial.println(" C)");
delay(30000);
}
