Alışıldığı Dışında Termometre (En büyük)

Merhaba arkadaşlar, Bu yazımızda daha önce paylaştığımız termometre projelerinde çok daha farklı olarak step motor kullanarak tüm duvarı termometre yapma hakkında olacak.
Yukardaki resimde gördüğünüz gibi büyük bir duvar termometreye çevirilmiştir. Bunda sadece ok şeklini yukarı aşağı hareket ettirerek kullanıcının havanın sıcaklığını gösteriyor.

Projede 18B20 sıcaklık sensöründen aldığı sıcaklığa göre step motoru yukarı aşağı hareketler yapacak şekilde hareket ettirir. Bu ayarların yapılması sizi korkutmasın duvarın uzunluğuna göre step motorun tur sayısını ayarlamanız gerekmektedir. Bu ayarlamayı Seri ekrandan yapabilirsiniz.

Projenin görünüşü

Led kullanımı size kalmış ama 18b20 ısı sensörü D4 pinine bağlıdır.

3 adet buton bağlanmıştır bu pinlerin yukarı-aşağı ve OK tuşları bunları arduinonun sırasıyla D6,D7 ve D3 pinlerine bağlayın.

Servo motoru  D8,D9,D10 ve D11 pinlerine bağlayın.

 

 

#include <OneWire.h>
 
const bool DEBUG = false;
 
const int pinLed = 5;
const int pinTempSensor = 4;
const int pinMicroswitch = 3;
const int pinButUp = 6;
const int pinButDown = 7;
 
const int pinStepMotor1 = 11;
const int pinStepMotor2 = 9;
const int pinStepMotor3 = 10;
const int pinStepMotor4 = 8;
 
int ButUp = 0;
int ButDown = 0;
int Microswitch = 0;
//94699-29754=64945/12
int TempStep = 5412;
long TempStartPosition = 29754;
 
bool MotorCalibrated = false;
long MotorPosition = 0;
int MotorStep = 0;
 
const long TempInterval = 5000;
unsigned long previousMillis = 0;
float Temp = 20.0;
const float MarriageSaver = 1.0;
 
 
OneWire ds(pinTempSensor);
 
void setup(void) {
  Serial.begin(9600);
  pinMode(pinLed, OUTPUT);
  pinMode(pinTempSensor, INPUT);
 
  pinMode(pinStepMotor1, OUTPUT);
  pinMode(pinStepMotor2, OUTPUT);
  pinMode(pinStepMotor3, OUTPUT);
  pinMode(pinStepMotor4, OUTPUT);
 
  pinMode(pinButUp, INPUT_PULLUP);
  pinMode(pinButDown, INPUT_PULLUP);
  pinMode(pinMicroswitch, INPUT_PULLUP);
}
 
void loop(void)
{
  //****************** read buttons state  ************************************************
  ButUp = !(bool)digitalRead(pinButUp);
  ButDown = !(bool)digitalRead(pinButDown);
  Microswitch = !(bool)digitalRead(pinMicroswitch);
 
  //****************** If debug is true (be aware it will slowdown the motor) *************
  if (DEBUG)
  {
    if ((millis() % 500) == 0)
    {
      Serial.print("  T=");
      Serial.print((float)Temp);
      Serial.print("  MS=");
      Serial.print(Microswitch ? "1" : "0" );
      Serial.print("  ButUp=" );
      Serial.print(ButUp ? "1" : "0");
      Serial.print("  ButDown=" );
      Serial.print(ButDown ? "1" : "0");
      Serial.print("  Calib=");
      Serial.print(MotorCalibrated ? "1" : "0");
      Serial.print("  MotPos=");
      Serial.print(MotorPosition);
      Serial.println("");
    }
  }
 
  //****************** Button up & Down ***************************************************
  if (ButUp ) {
    Motor(10, false);
    return;
  }
  if (ButDown)
  {
    Motor(10, true);
    return;
  }
 
  //****************** Check if motor already calibrated otherwice do *********************
  if (MotorCalibrated == false)
  {
    if (Microswitch)
    {
      MotorCalibrated = true;
      MotorPosition = 0;
    } else
    {
      Motor(10, false);
      return;
    }
  }
 
  //****************** GetTemp if the time is for it **************************************
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= TempInterval)
  {
    previousMillis = currentMillis;
    Temp = GetTemp();
  }
 
  //****************** Breakout main loop if in debug mode *******************************
  if (DEBUG)
  {
    return;
  }
 
  //****************** Set motorposition to temp *****************************************
  if (MotorCalibrated & Temp > 13 & Temp < 29) { long pos = abs((Temp - 28)) * TempStep + TempStartPosition; int MotorSpeed = 6; long Difference = abs(pos - MotorPosition); if (Difference > TempStep)
    {
      MotorSpeed = 10;
    }
 
    if (pos > MotorPosition)
    {
      Motor(MotorSpeed, true);
    } else if (pos < MotorPosition)
    {
      Motor(MotorSpeed, false);
    }
  }
}
 
//****************** Get temp from sensor  *******************************************
float GetTemp()
{
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
 
  if ( !ds.search(addr))
  {
    ds.reset_search();
    return;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44);
 
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  for ( i = 0; i < 9; i++)
  {
    data[i] = ds.read();
  }
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; celsius = (float)round(Temp * 9.0 + celsius) / 10.0 + MarriageSaver; return celsius; } //****************** Controling the step-motor ******************************* void Motor(int speed, bool MotorDirectionDown) { if (MotorDirectionDown == true) { MotorPosition++; MotorStep++; } else { MotorPosition--; MotorStep--; } if (MotorStep > 7) {
    MotorStep = 0;
  }
  if (MotorStep < 0) {
    MotorStep = 7;
  }
 
  switch (MotorStep) {
    case 0:
      digitalWrite(pinStepMotor1, LOW);
      digitalWrite(pinStepMotor2, LOW);
      digitalWrite(pinStepMotor3, LOW);
      digitalWrite(pinStepMotor4, HIGH);
      break;
    case 1:
      digitalWrite(pinStepMotor1, LOW);
      digitalWrite(pinStepMotor2, LOW);
      digitalWrite(pinStepMotor3, HIGH);
      digitalWrite(pinStepMotor4, HIGH);
      break;
    case 2:
      digitalWrite(pinStepMotor1, LOW);
      digitalWrite(pinStepMotor2, LOW);
      digitalWrite(pinStepMotor3, HIGH);
      digitalWrite(pinStepMotor4, LOW);
      break;
    case 3:
      digitalWrite(pinStepMotor1, LOW);
      digitalWrite(pinStepMotor2, HIGH);
      digitalWrite(pinStepMotor3, HIGH);
      digitalWrite(pinStepMotor4, LOW);
      break;
    case 4:
      digitalWrite(pinStepMotor1, LOW);
      digitalWrite(pinStepMotor2, HIGH);
      digitalWrite(pinStepMotor3, LOW);
      digitalWrite(pinStepMotor4, LOW);
      break;
    case 5:
      digitalWrite(pinStepMotor1, HIGH);
      digitalWrite(pinStepMotor2, HIGH);
      digitalWrite(pinStepMotor3, LOW);
      digitalWrite(pinStepMotor4, LOW);
      break;
    case 6:
      digitalWrite(pinStepMotor1, HIGH);
      digitalWrite(pinStepMotor2, LOW);
      digitalWrite(pinStepMotor3, LOW);
      digitalWrite(pinStepMotor4, LOW);
      break;
    case 7:
      digitalWrite(pinStepMotor1, HIGH);
      digitalWrite(pinStepMotor2, LOW);
      digitalWrite(pinStepMotor3, LOW);
      digitalWrite(pinStepMotor4, HIGH);
      break;
    default:
      digitalWrite(pinStepMotor1, LOW);
      digitalWrite(pinStepMotor2, LOW);
      digitalWrite(pinStepMotor3, LOW);
      digitalWrite(pinStepMotor4, LOW);
      break;
  }
  //****************** slowdown motor (value speed 1..10)  *************************************
  delay(11 - speed);
}

Alintidir

Boş zamanlarda arduino ile uğraşan kendi halinde bir Öğretmen.

 

Bir Cevap Yazın

Time limit is exhausted. Please reload CAPTCHA.