极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9876|回复: 0

问题:Arduino LCD温度控制程序,7号端口无效(减键无效)怀疑程序,大神求解

[复制链接]
发表于 2014-6-8 01:36:22 | 显示全部楼层 |阅读模式
本帖最后由 Zeroi 于 2014-6-8 01:43 编辑

程序如下: int bPin = 7;无效,试着7.8互换后还是只能加不能减

// Project 22 - LCD Thermostat

#include <LiquidCrystal.h>

#define beta 4090 // from your thermistors datasheet
#define resistance 10

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4-7 on pins 5-2
LiquidCrystal lcd(11, 10, 9, 5, 4, 3, 2);

int ledPin = A1;
int relayPin = A2;
int aPin = 8;
int bPin = 7;
int buttonPin = 6;
int analogPin = 0;

float setTemp = 10.0;
float measuredTemp;
char mode = 'C';        // can be changed to F
boolean override = false;
float hysteresis = 0.25;

void setup()
{
  lcd.begin(2, 20);
  pinMode(ledPin, OUTPUT);
  pinMode(relayPin, OUTPUT);  
  pinMode(aPin, INPUT);
  pinMode(bPin, INPUT);
  pinMode(buttonPin, INPUT);
  lcd.clear();
}

void loop()
{
  static int count = 0;
  measuredTemp = readTemp();
  if (digitalRead(buttonPin))
  {
    override = ! override;
    updateDisplay();
    delay(500); // debounce
  }
  int change = getEncoderTurn();
  setTemp = setTemp + change * 0.1;
  if (count == 1000)
  {
    updateDisplay();
    updateOutputs();
    count = 0;
  }
  count ++;
}

int getEncoderTurn()
{
  // return -1, 0, or +1
  static int oldA = LOW;
  static int oldB = LOW;
  int result = 0;
  int newA = digitalRead(aPin);
  int newB = digitalRead(bPin);
  if (newA != oldA || newB != oldB)
  {
    // something has changed
    if (oldA == LOW && newA == HIGH)
    {
      result = -(oldB * 2 - 1);
    }
  }
  oldA = newA;
  oldB = newB;
  return result;
}

float readTemp()
{
  long a = analogRead(analogPin);
  float temp = beta / (log(((1024.0 * resistance / a) - 10.0) / 10.0) + (beta / 298.0)) - 277.0;
  return temp;
}

void updateOutputs()
{
  if (override ||  measuredTemp < setTemp - hysteresis)
  {
    digitalWrite(ledPin, LOW);
    digitalWrite(relayPin, HIGH);
  }
  else if (!override && measuredTemp > setTemp + hysteresis)
  {
    digitalWrite(ledPin, HIGH);
    digitalWrite(relayPin, LOW);     
  }
}

void updateDisplay()
{
  lcd.setCursor(0,0);
  lcd.print("Actual: ");
  lcd.print(adjustUnits(measuredTemp));
  lcd.print(" o");
  lcd.print(mode);
  lcd.print(" ");
  
  lcd.setCursor(0,1);
  if (override)
  {
    lcd.print("  OVERRIDE ON   ");
  }
  else
  {
    lcd.print("Set:    ");
    lcd.print(adjustUnits(setTemp));
    lcd.print(" o");
    lcd.print(mode);
    lcd.print(" ");
  }
}

float adjustUnits(float temp)
{
  if (mode == 'C')
  {
    return temp;
  }
  else
  {
    return (temp * 9) / 5 + 32;
  }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 04:43 , Processed in 0.050085 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表