Делаем следящий за светом цветок на основе Arduino
Данный проект для Arduino позволит создать «биомиметический» или вдохновленный биологией цветок, который следует за источником света. Вы, наверное, замечали такое поведение у своих комнатных растений. Растения требуют солнечного света для своего роста, а «гелиотропные» или светоотслеживающие цветы обращаются к солнцу в течение дня, чтобы они поглощали как можно больше света. Этот процесс вдохновил многих разработчиков биомиметических технологий. В некоторых солнечных панелях используется подобная система, поэтому панели всегда находятся под прямыми солнечными лучами в течение дня.
Устройство проекта сравнивает значения двух светочувствительных датчиков, чтобы определить, где находится свет, а затем поворачивает серводвигатель, чтобы вращать цветок. Для проекта понадобятся плата Arduino, серводвигатель, два фоторезистора, два резистора 1 КОм, конденсатор, 100 мкФ, батарейка 9 В, провода, сосуд для самодельного цветка, бумага, ножницы, клей и немного фантазии для создания внешнего вида цветка.
Для того, чтобы устройство функционировало, нужно собрать схему, приведенную ниже. Основные моменты необходимо протестировать на макетной плате, затем собирать само изделие.
Два фоторезистора разместите подальше друг от друга, чтобы цветок смог однозначно определить присутствие света в том или ином месте. Ниже приведен код (скетч) для Arduino.
#include <Servo.h>
Servo myServo;
int const sensorPinLeft = A1; // аналоговый вход A0
int const sensorPinRight = A0; // аналоговый вход A1
int sensorValLeft; // переменная для хранения значений левого фоторезистора
int sensorValRight; // переменная для хранения значений правого фоторезистора
int sensorDiff;
int angle = 0; // переменная для хранения значений положения сервомотора
void setup() {
myServo.attach(9);
Serial.begin(9600);
}
void loop() {
sensorValLeft = analogRead(sensorPinLeft);
sensorValRight = analogRead(sensorPinRight);
sensorDiff = sensorValRight - sensorValLeft;
angle = map(sensorDiff, -500, 500, 0, 179); //угол представляет собой значение датчика, смасштабированное в промежуток 0-179
myServo.write(angle);
Serial.print("sensorDiff: ");
Serial.println(sensorDiff);
Serial.print("angle: ");
Serial.println(angle);
delay(15);
}