Делаем следящий за светом цветок на основе Arduino

Данный проект для Arduino позволит создать «биомиметический» или вдохновленный биологией цветок, который следует за источником света. Вы, наверное, замечали такое поведение у своих комнатных растений. Растения требуют солнечного света для своего роста, а «гелиотропные» или светоотслеживающие цветы обращаются к солнцу в течение дня, чтобы они поглощали как можно больше света. Этот процесс вдохновил многих разработчиков биомиметических технологий. В некоторых солнечных панелях используется подобная система, поэтому панели всегда находятся под прямыми солнечными лучами в течение дня.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/689-delaem-sledyaschiy-za-svetom-cvetok-na-osnove-arduino/images/delaem-sledyaschiy-za-svetom-cvetok-na-osnove-arduino-1.jpg

Устройство проекта сравнивает значения двух светочувствительных датчиков, чтобы определить, где находится свет, а затем поворачивает серводвигатель, чтобы вращать цветок. Для проекта понадобятся плата Arduino, серводвигатель, два фоторезистора, два резистора 1 КОм, конденсатор, 100 мкФ, батарейка 9 В, провода, сосуд для самодельного цветка, бумага, ножницы, клей и немного фантазии для создания внешнего вида цветка.

Для того, чтобы устройство функционировало, нужно собрать схему, приведенную ниже. Основные моменты необходимо протестировать на макетной плате, затем собирать само изделие.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/689-delaem-sledyaschiy-za-svetom-cvetok-na-osnove-arduino/images/delaem-sledyaschiy-za-svetom-cvetok-na-osnove-arduino-2.jpg

Два фоторезистора разместите подальше друг от друга, чтобы цветок смог однозначно определить присутствие света в том или ином месте. Ниже приведен код (скетч) для 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);
}