túlmelegedés kapcsoló

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
animal
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2016. február 10. szerda, 22:27

túlmelegedés kapcsoló

Hozzászólás Szerző: animal »

Sziasztok.

Ö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);
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: túlmelegedés kapcsoló

Hozzászólás Szerző: Robert »

Hangkeltés: tone eljárással könnyebb.

Ha nem muszáj float-ot nem használunk. Helyette egész, hőfok*10 pl. (ha kell tizedfok). Ha nem - csak egész számmal számolunk (8 bites chip - erőforrásigényes a lebegőpontos, törtszám)


Copy-paste fejlesztésnek nem lesz jó vége!
"Common_Anode" változó bennmaradt.....

Objektumorientált szerű a program. Ez baromira pazarolja a helyet (pl. rengeteg alprogramhívás van benne)
Ez mikrokontroller, nem PC:)


Hiányzik:
- Mi a hőmérőd?
- Kapcsolási skicc/rajz
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: túlmelegedés kapcsoló

Hozzászólás Szerző: kapu48 »

Jó nagy munka!

Látom, komolyan kezdesz érdeklődni a programozás iránt!

Ezért ajánlom szíves figyelmedbe az alábbi könyvet:
A C programozási nyelv
http://vili.pmmf.hu/portal/hu/c/documen ... groupId=18

Ha netán még Projectközlésre adnád a fejed?
Érdemes lenne megfogadni az ott leírt külalaki tanácsokat!
8)
animal
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2016. február 10. szerda, 22:27

Re: túlmelegedés kapcsoló

Hozzászólás Szerző: animal »

Robert írta: Hangkeltés: tone eljárással könnyebb.
ezt kifejtenéd egy kicsit bővebben?
Robert írta: Ha nem muszáj float-ot nem használunk. Helyette egész, hőfok*10 pl. (ha kell tizedfok). Ha nem - csak egész számmal számolunk (8 bites chip - erőforrásigényes a lebegőpontos, törtszám)
átalakítom
Robert írta: Copy-paste fejlesztésnek nem lesz jó vége!
"Common_Anode" változó bennmaradt.....
átírva
Robert írta: Objektumorientált szerű a program. Ez baromira pazarolja a helyet (pl. rengeteg alprogramhívás van benne)
Ez mikrokontroller, nem PC:)
igyekszem... csak megrögződtek a sok éves webes fejlesztéses nyelvek, mondjuk azért is jobban szeretem így mert ha mondjuk fél év múlva bele kell nyúlni nem kell átnyálazni meg keresgetni mindent :D
Robert írta: Hiányzik:
- Mi a hőmérőd?
lm335 z
Robert írta: - Kapcsolási skicc/rajz
Schematic ábra, bár ezen nincs rajta a relay
http://darksky.hu/schematic.html

Köszönöm az észrevételeket, tanácsokat.
A hozzászólást 2 alkalommal szerkesztették, utoljára animal 2016. február 11. csütörtök, 21:50-kor.
animal
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2016. február 10. szerda, 22:27

Re: túlmelegedés kapcsoló

Hozzászólás Szerző: animal »

kapu48 írta:Jó nagy munka!

Látom, komolyan kezdesz érdeklődni a programozás iránt!

Ezért ajánlom szíves figyelmedbe az alábbi könyvet:
A C programozási nyelv
http://vili.pmmf.hu/portal/hu/c/documen ... groupId=18

Ha netán még Projectközlésre adnád a fejed?
Érdemes lenne megfogadni az ott leírt külalaki tanácsokat!
8)

Köszönöm
animal
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2016. február 10. szerda, 22:27

Re: túlmelegedés kapcsoló

Hozzászólás Szerző: animal »

Robert írta: Hangkeltés: tone eljárással könnyebb.
megtaláltam és valóban :lol:

Kód: Egész kijelölése

const int PIN_BUTTON = 2;
const int PIN_BUZZER = 3;
const int PIN_CONTROLLER = 5;
const int PIN_LED_GREEN = 9;
const int PIN_LED_BLUE = 10;
const int PIN_LED_RED = 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 int TEMPERATURE_LIMIT = 40; // Hofok ertek limit

byte device_status = DEVICE_ON; // Eszkoz aktualis statuszterteke
boolean device_overheated = false; // Eszkoz tul van-e melegedve

/**
 * 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)
{
  red = 0 + red;
  green = 0 + green;
  blue = 0 + blue;

  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.
 */
int 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) {
      tone(PIN_BUZZER, 2800, 100);
    }

    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(500);
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: túlmelegedés kapcsoló

Hozzászólás Szerző: Robert »

A program végén a delay (30000); miért van?
animal
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2016. február 10. szerda, 22:27

Re: túlmelegedés kapcsoló

Hozzászólás Szerző: animal »

Robert írta:A program végén a delay (30000); miért van?
Eliras volt, de az elozo hozzaszolasomban ott a frisitett code. Kellemes napot.
Válasz küldése