아두이노

아두이노 종합

ADELA_J 2023. 7. 31. 14:52
더보기

#include <LiquidCrystal_I2C.h>      //LCD
#include <Servo.h>      //서브모터
#include "DHT.h"    //온도센서
// #include <TM1637TinyDisplay.h>
// #include <Adafruit_MLX90614.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

#define LED_RED 5
#define LED_GREEN 6
#define LED_BLUE  11
#define SERVO_PIN 8
#define PIEZO_BUZZER  3
// #define CLK 9
// #define DIO 10
#define BUTTON_1 4
#define BUTTON_2 7
#define VR_PIN  A0    //가변저항
#define BRIGHT_PIN  A1    //조도센서
#define DHTPIN 2    //온도센서


Servo myservo;
// TM1637TinyDisplay display(CLK, DIO);
// Adafruit_MLX90614 mlx = Adafruit_MLX90614();
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  myservo.attach(SERVO_PIN);
  // display.setBrightness(BRIGHT_7);
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
  // mlx.begin(); //비접촉물리센서
  dht.begin();
  lcd.begin();
  lcd.setCursor(0,0);   //텍스트가 LCD에 나타날 위치
  lcd.print("Hello, world");
  delay(2000);
  lcd.clear();

}

void loop() {
  if (Serial.available() > 0)
  {
    String strRead = Serial.readStringUntil('\n');
    if (strRead.indexOf("RGB=") != -1)
    {
      int commaIndex1 = strRead.indexOf(",");
      int commaIndex2 = strRead.indexOf(",", commaIndex1 + 1);

      int redValue = strRead.substring(4, commaIndex1).toInt();
      int greenValue = strRead.substring(commaIndex1 + 1, commaIndex2).toInt();
      int blueValue = strRead.substring(commaIndex2 + 1, strRead.length()).toInt();

      redLedSet(redValue, greenValue, blueValue);
      Serial.println("OKRGB");
      lcd.setCursor(0,0);
      lcd.print("OKRGB");
    }
    else if (strRead.indexOf("SERVO=") != -1)
    {
      int servoDigree = strRead.substring(6, strRead.length()).toInt();
      if (servoDigree <= 180)
      {
        myservo.write(servoDigree);
        Serial.println("OKSERVO");
      }
      else Serial.println("error digree");
    }
    else if (strRead.indexOf("BUZZER=") != -1)
    {
      float bzFreq = strRead.substring(7, strRead.length()).toFloat();
      setBuzzer(bzFreq);
    }
    else if (strRead.indexOf("FND=") != -1)
    {
      float fndValue = strRead.substring(4, strRead.length()).toFloat();
      lcd.setCursor(0,0);
      lcd.print(fndValue);
      Serial.println("OKFND");
    }
    else if (strRead.indexOf("VR=?") != -1)
    {
      Serial.print("VR=");
      Serial.println(analogRead(VR_PIN));
    }
    else if (strRead.indexOf("BRIGHT=?") != -1)
    {
      Serial.print("BRIGHT=");
      Serial.println(analogRead(BRIGHT_PIN));
    }
    else if (strRead.indexOf("TEMPERATURE=?") != -1)
    {
      sendTemperature();
    }
    else if (strRead.indexOf("HUMIDITY=?") != -1)
    {
      sendHumidity();
    }
    // else if (strRead.indexOf("OBJECT=?") != -1)
    // {
    //   float objectTemp = mlx.readObjectTempC();
    //   Serial.print("OBJECT=");
    //   Serial.println(objectTemp);
    // }
    // else if (strRead.indexOf("AMBIENT=?") != -1)
    // {
    //   float ambientTemp = mlx.readAmbientTempC();
    //   Serial.print("AMBIENT=");
    //   Serial.println(ambientTemp);
    // }
  }

  if (btn1() == 1) Serial.println("BUTTON1=CLICK");
  if (btn2() == 1) Serial.println("BUTTON2=CLICK");
}

void redLedSet(int red, int green, int blue)
{
  analogWrite(LED_RED, red);
  analogWrite(LED_GREEN, green);
  analogWrite(LED_BLUE, blue);
}

void setBuzzer(int freq)
{
  if (freq > 31)
  {
    tone(PIEZO_BUZZER, freq);
    Serial.println("OKBUZZER");
  }
  else
  {
    noTone(PIEZO_BUZZER);
    Serial.println("OKBUZZER");
  }
}

int btn1()
{
  static int currBtn = 0;
  static int prevBtn = 0;

  currBtn = digitalRead(BUTTON_1);

  if (currBtn != prevBtn)
  {
    prevBtn = currBtn;
    if (currBtn == 1)
    {
      return 1;
    }
    delay(500);
  }
  return 0;
}

int btn2()
{
  static int currBtn = 0;
  static int prevBtn = 0;

  currBtn = digitalRead(BUTTON_2);

  if (currBtn != prevBtn)
  {
    prevBtn = currBtn;
    if (currBtn == 1)
    {
      return 1;
    }
    delay(500);
  }
  return 0;
}

void sendTemperature()
{
  float temperature = dht.readTemperature();
  if (!isnan(temperature))
  {
    Serial.print("TEMPERATURE=");
    Serial.println(temperature);
  }
  else
  {
    Serial.print("TEMPERATURE=");
    Serial.println(0);
  }
}

void sendHumidity()
{
  float humidity = dht.readHumidity();
  if (!isnan(humidity))
  {
    Serial.print("HUMIDITY=");
    Serial.println(humidity);
    lcd.print(humidity);
  }
  else
  {
    Serial.print("HUMIDITY=");
    Serial.println(0);
  }
}