0

我做一个家庭项目只是为了好玩,我对 Arduino 很陌生,但我知道基础知识。

我正在创建一个自动百叶窗,它会在黑暗时打开,在明亮时关闭。

因此,百叶帘的百叶窗在光传感器检测到黑暗时会旋转到打开位置,当光传感器检测到光时会旋转到关闭位置。

我在用着:

arduino uno r3/连续伺服电机/led/LDR(光传感器)/10k电阻/

此代码适用于标准伺服电机。我希望它与连续伺服电机一起工作,因为你可以“更好地控制它”,它就是我所拥有的。

我想我需要一个类似这样的 if 语句:

如果光传感器检测到黑暗则将伺服电机旋转一定角度然后停止,如果光传感器检测到光则将伺服电机旋转一定角度然后停止。

#include <Servo.h>

Servo servo1;

int sensorPin = A0;            // select the input pin for the ldr
int ledPin = 13;  
unsigned int sensorValue = 0;
int servoPin = 9;
int pos = 0;

void setup()
{
  //Start Serial port
  Serial.begin(9600);        // start serial for output - for testing
  servo1.attach(9);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  // For DEBUGGING - Print out our data, uncomment the lines below
  Serial.print("Cell = ");     // print the value (0 to 1024)
  Serial.println(analogRead(sensorPin));                   // print carriage return  

  pos = analogRead(sensorPin);
  pos = constrain (pos, 0, 1023);

  int servoPos = map(pos, 0, 1023, 255, 0);
  int servoDegree = map(servoPos, 255, 0, 0, 179);

  servo1.write(servoDegree);
  Serial.print("Servo Degree = ");
  Serial.println(servoDegree);


  int val = analogRead(sensorPin);
  val = constrain (val, 0, 1023);

  int ledLevel = map(val, 0, 1023, 255, 0);
  analogWrite (ledPin, ledLevel);  

  delay(50);  
}   
4

1 回答 1

1

使用连续伺服电机,您会放弃位置信息。(有关详细信息,请参阅此Polou页面。)这意味着您不会知道百叶窗何时到达其打开/关闭位置,除非您还添加了限位开关。如果您使用开关,那么连续伺服将起作用。更好的解决方案可能是像 AdaFruit 这样的小型减速步进电机。它们具有扭矩,但比连续伺服系统慢得多

关键是您不想连续为电机通电(这是标准伺服系统保持位置的方式)。这很浪费,并且会在百叶窗应用中日复一日地烧毁电机。您希望它完成任务,然后在 loop() 中等待状态(您的应用程序中的亮度级别)发生变化。所以你需要跟踪最后的光照水平,然后在 loop() 检查当前的光照水平是否不同(并且大于你必须通过测试确定的某个阈值),然后改变百叶窗的状态并存储最后一层。

于 2014-03-20T01:14:46.627 回答