Оглавление:

IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР: 8 шагов
IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР: 8 шагов

Видео: IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР: 8 шагов

Видео: IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР: 8 шагов
Видео: AADAT 1.5kW солнечный трекер на ЦЕПИ своими руками 2024, Июль
Anonim
Image
Image
IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР
IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР
IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР
IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - КОНТРОЛЛЕР

Это расширение Instructable

IOT123 - СОЛНЕЧНЫЙ ТРЕКЕР - НАКЛОН / ПАНЕЛЬ, ПАНЕЛЬНАЯ РАМА, УСТАНОВКА ДЛЯ МОНТАЖА LDR. Здесь мы сосредоточимся на контроллере сервоприводов и датчиках положения солнца. Важно отметить, что эта конструкция предполагает использование 2 микроконтроллеров: один (3,3 В 8 МГц Arduino Pro Mini) для солнечного трекера и один независимый микроконтроллер для ваших датчиков / актеров.

Это версия 0.3

Вместо того, чтобы публиковать все проекты после полного удовлетворения, я буду практиковать непрерывную интеграцию и предоставлять что-то чаще, изменяя то, что я сделал, по мере необходимости. Я напишу еще одно руководство по зарядному устройству, _ когда_ оптимизация программного и аппаратного обеспечения контроллера будет завершена. Я укажу, где необходима оптимизация, по мере того, как мы будем это делать.

Частично причина такого подхода - отзывы клиентов. Если вы, ребята, видите необходимость или у вас есть лучший подход, прокомментируйте, но имейте в виду, что я не могу доставить все и, возможно, не в те сроки, которые вам подходят. Поскольку эти объяснения кажутся менее актуальными, они будут удалены из этой статьи.

Что сюда входит:

  1. Используйте LDR из оригинального Instructable, чтобы определить приблизительное местоположение солнц.
  2. Переместите сервоприводы лицом к солнцу.
  3. Варианты чувствительности движений.
  4. Варианты размера шага при движении к солнцу.
  5. Варианты угловых ограничений, используемых на сервоприводах.
  6. Варианты задержки движений.
  7. Интерфейс I2C для установки / получения значений между микроконтроллерами.
  8. Глубокий сон между движениями.

Что сюда не входит (и будет рассмотрено, если позволит время):

  1. Только в светлое время суток.
  2. Запоминание положения рассвета и выход к нему при выключении в сумерках.
  3. Снятие регулятора с MCU.
  4. Отключение светодиодов на MCU.
  5. Перенаправление питания через VCC, а не через RAW.
  6. Предоставление обходных путей для прошивки без регулируемого питания от преобразователя USB в последовательный TTL.
  7. Монитор напряжения аккумуляторной батареи.

ИСТОРИЯ

20 декабря 2017 г., КОД V0.1

Первоначальная версия отслеживает источник света, всегда включен, без зарядки

7 января 2018 г. КОД V0.2

  • АППАРАТНЫЕ ИЗМЕНЕНИЯ

    • Добавить контакты I2C
    • Добавить переключатель к земле сервопривода
    • Напечатанная этикетка на лицевой панели блока контроллера
  • ИЗМЕНЕНИЯ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ

    • Прочитать конфигурацию из EEPROM
    • Поддержка шины I2C в качестве ведомого устройства для другого MCU (3,3 В)
    • Настроить конфигурацию через I2C
    • Установите Включено через I2C
    • Получить конфигурацию через I2C
    • Получить свойства среды выполнения через I2C (в настоящее время включено и текущая интенсивность освещения)
    • Удалить последовательное ведение журнала (это повлияло на значения I2C)

19 января 2018 г. КОД V0.3

  • АППАРАТНОЕ ОБЕСПЕЧЕНИЕ

    Ярлык обновлен. Переключатель теперь используется для выбора режима CONFIG или TRACK

  • ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

    • I2C используется только для конфигурации
    • Контроллер ждет 5 секунд перед инициализацией отслеживания, позволяет перемещать руки
    • Чтобы использовать конфигурацию I2C, SPDT должен быть на CONFIG при загрузке устройства.
    • В промежутках между отслеживанием движения устройство находится в режиме глубокого сна для значения конфигурации МИНУТЫ СНА (по умолчанию 20 минут).

Шаг 1. Материалы и инструменты

Материалы и инструменты
Материалы и инструменты
Материалы и инструменты
Материалы и инструменты
Материалы и инструменты
Материалы и инструменты

Теперь есть полный список материалов и источников.

  1. Детали, напечатанные на 3D-принтере.
  2. Arduino Pro Mini 3,3 В 8 МГц
  3. 1 универсальная печатная плата с двухсторонней прототипной печатной платой 4x6 см (разрезать пополам)
  4. 1 шт. С наружной резьбой 40P (необходимо обрезать по размеру).
  5. 1 штекер с внутренней резьбой 40P (необходимо обрезать по размеру).
  6. 4 резистора 10K 1 / 4W.
  7. Монтажный провод.
  8. Припой и железо.
  9. 20 саморезов из нержавеющей стали 4G x 6 мм с полукруглой головкой.
  10. 4 самореза из нержавеющей стали с потайной головкой 4G x 6 мм.
  11. 1 литий-полимерный аккумулятор 3,7 В и держатель (заканчивающийся 2-контактными разъемами dupont).

  12. 1 шт., 2-полюсный штекер под прямым углом
  13. 1 выключатель SPDT 3 контакта с шагом 2,54 мм
  14. Сильный цианоакрилатный клей
  15. Разъемы Dupont, розетка 1P (1 синий, 1 зеленый).

Шаг 2: Сборка схемы

Сборка схемы
Сборка схемы
Сборка схемы
Сборка схемы
Сборка схемы
Сборка схемы

Схема в настоящее время не имеет цепи делителя напряжения (вольтметра).

  1. Разрежьте двухстороннюю универсальную печатную плату прототипа PCB 4x6 см пополам по длинной оси.
  2. Разрежьте штекер 40P на части:

    1. 2 из 12P
    2. 3 от 3P
    3. 6 шт. 2П.
  3. Разрежьте женский заголовок 40P на части:

    1. 2 из 12P
    2. 1 от 6P
  4. Припаяйте 2 к гнезду 12P, как показано.
  5. Приклейте прокладку, снятую с 3-полюсной (дополнительной) вилки, к нижней стороне переключателя SPDT с помощью цианоакрилатного клея.
  6. С другой стороны, затем припаяйте 6 разъемов 2P, 2 разъема 3P male и переключатель SPDT, как показано.
  7. Припаяйте 4 резистора 10K (A, B, C, D, черные) через вывод к контакту GND (черный # 2) и к контактам A0 - A3 (# 5, # 6, # 7, # 8), затем через отверстие (желтый) как показано (3 фото + 1 диаграмма).
  8. Отследите 3,3 В от штырей LDR при пайке штырей №4, №6, №8, №10 и проденьте через отверстие к контакту VCC разъема (зеленый).
  9. Проведите 3,3 В на стороне разъема «мама», как показано (красный), при пайке к контактам №1, №12, №15.
  10. Сквозное отверстие 3,3 В на припаянной (красной) стороне разъема RAW PIN # 1.
  11. Проследите оранжевое соединение от контакта №11 через отверстие, чтобы припаять женский контакт на другой стороне, как показано.
  12. Отследите и припаяйте синий соединительный провод от №20 к №30 и от №31 к №13 и №16.
  13. Припаяйте контакт № 11 гнездового разъема к контакту № 11 штекерного разъема через отверстие.
  14. Подготовьте 2 соединителя dupont длиной 30 мм с гнездом 1P (1 синий, 1 зеленый). Зачистите и залудите другой конец.
  15. Припаять синий провод Dupont к # 28; припаять зеленый провод Dupont к №29.
  16. На верхней стороне Arduino закрепите гнездовой разъем 6P, затем припаяйте.
  17. На верхней части Arduino закрепите 2-полюсный прямоугольный гнездовой разъем int # 29 и # 30, затем припаяйте.
  18. На нижней стороне Arduino закрепите 2 12-контактных и 1 3-полюсный штыревые контакты, затем припаяйте.
  19. Вставьте 12-контактные штыри Arduino в разъемы PCB 12P.

Шаг 3: Прошивка MCU

Прошивка MCU
Прошивка MCU
Прошивка MCU
Прошивка MCU
Прошивка MCU
Прошивка MCU

Arduino Pro Mini удобно прошивать с помощью преобразователя FTDI232 USB в TTL с использованием 6P гнездового разъема. На фото выше показано выравнивание двух досок.

Убедитесь, что на FTDI232 выбрано значение 3,3 В. Следуйте инструкциям здесь, используя приведенный ниже код (используйте ссылку на GIST).

Библиотека lowpower (прилагается и https://github.com/rocketscream/Low-Power) должна быть установлена.

После того, как плата Arduino Pro Mini + установлена в корпус, ее все еще можно прошить, поскольку контакты заголовка открыты. Просто отсоедините блок контроллера от рамы панели, чтобы открыть заголовок.

Наклонный солнечный трекер с конфигурацией I2C / EEPROM и циклом сна между движениями. Точность продолжительности цикла сна уменьшается с увеличением продолжительности, но этого достаточно для этой цели

/*
* изменено из кода
* Матиас Лерой
*
* V0.2 МОДИФИКАЦИИ
** I2C НАБОР ПОЛУЧИТЬ
** НАБОР EEPROM ПОЛУЧИТЬ
** УДАЛИТЬ ПОСЛЕДОВАТЕЛЬНЫЙ ВЫХОД - ЗАТРАГИВАЕМЫЙ I2C
** ВКЛЮЧИТЬ / ОТКЛЮЧИТЬ ОТСЛЕЖИВАНИЕ
** ПЕРЕМЕСТИТЕ СЕРВИСЫ НА ПРЕДЕЛЫ ЧЕРЕЗ I2C
** ПРОЧИТАТЬ ТЕКУЩУЮ СРЕДНЮЮ ИНТЕНСИВНОСТЬ ЧЕРЕЗ I2C
* V0.3 МОДИФИКАЦИИ
** ПЕРЕКЛЮЧАТЕЛЬ ДЛЯ 2 РЕЖИМОВ - ТРЕК (БЕЗ I2C) и КОНФИГУРАЦИЯ (ИСПОЛЬЗУЕТ I2C)
** РЕЖИМ СНА В ТРЕКОВОМ РЕЖИМЕ (ОЧЕНЬ НИЗКАЯ ТОЧНОСТЬ ИЗ-ЗА 8 СЕКУНДОВ)
** ОТКЛЮЧИТЬ / ПРИКЛЮЧИТЬ СЕРВИСЫ В СОНЕ / ПРОБУЖДЕНИИ (ТРАНЗИСТОР ИСПОЛЬЗУЕТСЯ ВСЕГДА)
** УДАЛИТЬ КОНФИГУРИРУЕМОЕ НАЧАЛЬНОЕ ПОЛОЖЕНИЕ (РЕЗЕРВНОЕ)
** УДАЛИТЬ КОНФИГУРИРУЕМЫЕ СЕКУНДЫ БУДИЛЬНИКА (РЕЗЕРВНЫЕ)
** УДАЛИТЬ КОНФИГУРИРУЕМОЕ ВКЛЮЧЕНИЕ / ВЫКЛЮЧЕНИЕ (РЕЗЕРВИРОВАНИЕ)
** УДАЛЕНИЕ КОНФИГУРИРУЕМОГО ТРЕКЕРА ВКЛЮЧЕНО (ИСПОЛЬЗУЙТЕ АППАРАТНЫЙ ПЕРЕКЛЮЧАТЕЛЬ)
** СНИМИТЕ ПРИЕМНИК НАПРЯЖЕНИЯ - ИСПОЛЬЗУЕТ ОТДЕЛЬНЫЙ КОМПОНЕНТ I2C.
** ДОБАВИТЬ ПОСЛЕДОВАТЕЛЬНЫЙ ЖУРНАЛ, ЕСЛИ I2C НЕ ИСПОЛЬЗУЕТСЯ
*/
#включают
#включают
#включают
#включают
#включают
# defineEEPROM_VERSION1
# defineI2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_LDR_BL A2
# definePIN_SERVO_V11
# definePIN_SERVO_H5
# defineIDX_I2C_ADDR0
# defineIDX_V_ANGLE_MIN1
# defineIDX_V_ANGLE_MAX2
# defineIDX_V_SENSITIVITY3
# defineIDX_V_STEP4
# defineIDX_H_ANGLE_MIN5
# defineIDX_H_ANGLE_MAX6
# defineIDX_H_SENSITIVITY7
# defineIDX_H_STEP8
# defineIDX_SLEEP_MINUTES9
# defineIDX_V_DAWN_ANGLE10
# defineIDX_H_DAWN_ANGLE11
# defineIDX_DAWN_INTENSITY12 // среднее значение всех LDRS
# defineIDX_DUSK_INTENSITY13 // среднее значение всех LDRS
# defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // среднее значение всех LDRS - используется для расчета IDX_DAWN_INTENSITY непрямого окружающего света
# defineIDX_END_VALUES_GET16
# defineIDX_SIGN_117
# defineIDX_SIGN_218
# defineIDX_SIGN_319
Servo _servoH;
Servo _servoV;
byte _i2cVals [20] = {10, 10, 170, 20, 5, 10, 170, 20, 5, 20, 40, 10, 30, 40, 0, 0, 0, 0, 0, 0};
int _servoLoopDelay = 10;
int _slowingDelay = 0;
int _angleH = 90;
int _angleV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
byte _i2cResponse = 0;
bool _inConfigMode = false;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
if (inConfigMode ()) {
Serial.println («Режим конфигурации»);
Serial.print ("Адрес I2C:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (receiveEvent);
Wire.onRequest (requestEvent);
}еще{
Serial.println («Режим слежения»);
delay (5000); // пора убрать руки при подключении аккумулятора и т. д.
}
}
voidloop ()
{
getLightValues ();
if (! _inConfigMode) {
// Задача: ВКЛЮЧИТЬ ТРАНЗИСТОРНЫЙ ПЕРЕКЛЮЧАТЕЛЬ
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
for (int i = 0; i <20; i ++) {
if (i! = 0) {
getLightValues ();
}
moveServos ();
}
задержка (500);
_servoH.detach ();
_servoV.detach ();
// Задача: ВЫКЛЮЧИТЬ ТРАНЗИСТОРНЫЙ ПЕРЕКЛЮЧАТЕЛЬ
задержка (500);
asleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- ТЕКУЩИЙ РЕЖИМ
boolinConfigMode () {
pinMode (PIN_SERVO_H, ВХОД);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
return _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
если(
EEPROM.read (IDX_SIGN_1)! = 'S' ||
EEPROM.read (IDX_SIGN_2)! = 'T' ||
EEPROM.read (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_read_configuration ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
for (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
EEPROM.update (i, _i2cVals );
}
EEPROM.update (IDX_SIGN_1, 'S');
EEPROM.update (IDX_SIGN_2, 'T');
EEPROM.update (IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("Конфигурация_читка EEPROM");
for (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
если (count == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
байтовый индекс = Wire.read ();
значение байта = Wire.read ();
switch (cmd) {
case'G ':
if (индекс <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [индекс];
}
перерыв;
случаи':
if (индекс <IDX_END_EEPROM_SET) {
_i2cVals [индекс] = значение;
EEPROM.update (индекс, _i2cVals [индекс]);
}
перерыв;
дефолт:
возвращение;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDR
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = analogRead (PIN_LDR_BL);
_averageTop = (valueTopLeft + valueTopRight) / 2;
_averageRight = (valueTopRight + valueBottomRight) / 2;
_averageBottom = (valueBottomRight + valueBottomLeft) / 2;
_averageLeft = (значениеBottomLeft + значениеTopLeft) / 2;
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4;
_i2cVals [IDX_CURRENT_INTENSITY] = map (avgIntensity, 0, 1024, 0, 255);
}
// --------------------------------- СЕРВИСЫ
voidmoveServos () {
Serial.println ("moveServos");
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// идем налево
Serial.println ("moveServos идет налево");
задержка (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
задержка (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH + _i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// идем направо
Serial.println ("moveServos идет налево");
задержка (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
задержка (_servoLoopDelay);
}
}
еще {
// ничего не делать
Serial.println ("moveServos ничего не делает");
задержка (_slowingDelay);
}
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV + _i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// подниматься
Serial.println ("moveServos поднимается");
задержка (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
задержка (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// спускаться
Serial.println ("moveServos отключается");
задержка (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
задержка (_servoLoopDelay);
}
}
еще {
Serial.println ("moveServos ничего не делает");
задержка (_slowingDelay);
}
}
//---------------------------------СПАТЬ
voidasleepFor (unsignedint восемьSecondSegments) {
Serial.println ("asleepFor");
for (unsignedint sleepCounter = 8SecondSegments; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

просмотреть rawtilt_pan_tracker_0.3.ino, размещенный на ❤ на GitHub

Шаг 4: Сборка кожуха схемы

Сборка кожуха схемы
Сборка кожуха схемы
Сборка кожуха схемы
Сборка кожуха схемы
Сборка корпуса схемы
Сборка корпуса схемы
  1. Убедитесь, что Ardiuno Pro Mini вставлен в разъемы на печатной плате.
  2. Вставьте основание блока контроллера SOLAR TRACKER в стенки блока контроллера SOLAR TRACKER и закрепите двумя саморезами из нержавеющей стали 4G x 6 мм с потайной головкой.
  3. Вставьте плату Ardiuno Pro Mini + с прорезью для заголовка 6P в пустоту в основании блока контроллера SOLAR TRACKER.
  4. Вставьте крышку блока контроллера SOLAR TRACKER в стенки блока контроллера SOLAR TRACKER и закрепите двумя саморезами 4G x 6 мм с потайной головкой из нержавеющей стали.
  5. Прикрепите сборку выше к основанию рамы панели с помощью 4 саморезов из нержавеющей стали 4G x 6 мм с потайной головкой.

Шаг 5: Подключение выводов буровой установки к контроллеру

Подключение выводов буровой установки к контроллеру
Подключение выводов буровой установки к контроллеру
Подключение выводов буровой установки к контроллеру
Подключение выводов буровой установки к контроллеру
Подключение выводов буровой установки к контроллеру
Подключение выводов буровой установки к контроллеру

Соответствующие соединения, готовые из предыдущего Instructable, - это 4 выключенных 2-полюсных соединения LDR и 2 выключенных 3-полюсных соединения от сервоприводов. Что временно, пока не будет готова подзарядка, так это аккумулятор. На данный момент используйте LiPo 3,7 В с 2-контактным разъемом DuPont.

  1. Вставьте соединения LDR (без полярности) сверху:

    1. В правом верхнем углу
    2. Верхний левый
    3. Внизу справа
    4. Нижняя левая
  2. Вставьте соединения сервопривода (сигнальный провод слева) сверху:

    1. По горизонтали
    2. Вертикальный
  3. Дождитесь готовности к тесту. Затем: Вставьте провод питания 3,7 В постоянного тока + ve в верх, -ve в нижнюю часть.

Шаг 6: Тестирование контроллера

Image
Image

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

Чтобы проверить отслеживание в контролируемой среде, может быть удобно установить МИНУТЫ СНА на более низкое значение (см. Следующий шаг).

Шаг 7: Настройка через I2C с использованием ввода с консоли

Это объясняет настройку контроллера через второй MCU, ввод настроек в окно консоли.

  1. Загрузите следующий скрипт в БЛОК WIFI D1M (или Wemos D1 Mini).
  2. Отключите USB от ПК
  3. КОНТАКТНЫЕ СОЕДИНЕНИЯ: -ve (Контроллер) => GND (D1M) + ve (Контроллер) => 3V3 (D1M) SCL (Контроллер) => D1 (D1M)

    SDA (Контроллер) => D2 (D1M)

  4. Установите переключатель SPDT в положение CONFIG.
  5. Подключите USB к ПК
  6. В среде Arduino IDE запустите консольное окно с правильным COM-портом.
  7. Убедитесь, что выбраны «Новая строка» и «9600 бод».
  8. Команды вводятся в текстовое поле «Отправить» с последующим нажатием клавиши Enter.
  9. Команды имеют формат Символьный байт-байт
  10. Если второй байт (третий сегмент) не включен, скрипт отправляет 0 (ноль)
  11. Будьте осторожны при использовании последовательного ввода; проверьте, что вы ввели, прежде чем нажимать клавишу «Ввод». Если вы заблокированы (например, изменили адрес I2C на значение, которое вы забыли), вам нужно будет заново прошить микропрограмму контроллера.

Поддерживаемые варианты первого символа команды:

  • E (Включить отслеживание сервопривода) полезно для остановки движения во время настройки. Это вводится с использованием: E 0
  • D (Отключить отслеживание сервопривода) полезно для запуска автоматического отслеживания, если устройство не перезагружается. Это вводится с использованием: D 0
  • G (Получить значение конфигурации) считывает значения из EEPROM и IN-MEMORY: Это вводится с использованием: G (индекс - допустимые байтовые значения 0-13 и 15)
  • S (Установить значение EEPROM) устанавливает значения EEPROM, которые доступны после перезагрузки. Это вводится с использованием: S (индекс - допустимые байтовые значения от 0 до 13, значение - допустимые байтовые значения и варьируются в зависимости от свойства)

Код является точкой истины для индексов, но в качестве руководства для допустимых значений / комментариев используется следующее:

  • I2C ADDRESS 0 - адрес подчиненного устройства контроллера, мастеру необходим для связи с контроллером (по умолчанию 10)
  • МИНИМАЛЬНЫЙ ВЕРТИКАЛЬНЫЙ УГОЛ 1 - нижний предел угла вертикального сервопривода (по умолчанию 10, диапазон 0-180)
  • МАКСИМАЛЬНЫЙ ВЕРТИКАЛЬНЫЙ УГОЛ 2 - верхний предел угла вертикального сервопривода (по умолчанию 170, диапазон 0 - 180)
  • ЧУВСТВИТЕЛЬНОСТЬ ВЕРТИКАЛЬНОЙ LDR 3 - Вертикальная граница считывания LDR (по умолчанию 20, диапазон 0-1024)
  • ВЕРТИКАЛЬНЫЙ УГОЛ ШАГ 4 - угловые шаги сервопривода по вертикали при каждой регулировке (по умолчанию 5, диапазон 1-20)
  • МИНИМАЛЬНЫЙ ГОРИЗОНТАЛЬНЫЙ УГОЛ 5 - нижний предел горизонтального сервопривода угла (по умолчанию 10, диапазон 0 - 180)
  • МАКСИМАЛЬНЫЙ ГОРИЗОНТАЛЬНЫЙ УГОЛ 6 - верхний предел горизонтального сервопривода угла (по умолчанию 170, диапазон 0 - 180)
  • ЧУВСТВИТЕЛЬНОСТЬ HORIZONTAL LDR 7 - Горизонтальная граница считывания LDR (по умолчанию 20, диапазон 0-1024)
  • HORIZONTAL ANGLE STEP 8 - шаг горизонтального сервопривода угла при каждой регулировке (по умолчанию 5, диапазон 1-20)
  • SLEEP MINUTES 9 - приблизительный период сна между отслеживанием (по умолчанию 20, диапазон 1-255)
  • ВЕРТИКАЛЬНЫЙ УГОЛ РАССВЕТА 10 - БУДУЩЕЕ ИСПОЛЬЗОВАНИЕ - вертикальный угол, к которому нужно вернуться, когда солнце садится.
  • ГОРИЗОНТАЛЬНЫЙ УГОЛ РАССВЕТА 11 - БУДУЩЕЕ ИСПОЛЬЗОВАНИЕ - горизонтальный угол, к которому нужно вернуться, когда солнце садится.
  • ИНТЕНСИВНОСТЬ РАССВЕТА 12 - БУДУЩЕЕ ИСПОЛЬЗОВАНИЕ - минимальное среднее значение всех LDR, которое запускает начало ежедневного отслеживания солнца.
  • СУМЕРНАЯ ИНТЕНСИВНОСТЬ 13 - БУДУЩЕЕ ИСПОЛЬЗОВАНИЕ - минимальное среднее значение всех LDR, которое запускает конец ежедневного слежения за солнцем.
  • КОНЕЦ ЗНАЧЕНИЙ EEPROM МАРКЕР 14 - ЗНАЧЕНИЕ НЕ ИСПОЛЬЗУЕТСЯ
  • CURRENT INTENSITY 15 - текущий средний процент интенсивности света
  • КОНЕЦ МАРКЕРА ЗНАЧЕНИЙ В ПАМЯТИ 16 - ЗНАЧЕНИЕ НЕ ИСПОЛЬЗУЕТСЯ.

Захватывает последовательный ввод (ввод с клавиатуры в окне консоли) и пересылает его ведомому устройству I2C в формате char, byte, byte

#включают
# defineI2C_MSG_IN_SIZE2
# defineI2C_MSG_OUT_SIZE3
# defineI2C_SLAVE_ADDRESS10
логическое _newData = false;
const byte _numChars = 32;
char _receivedChars [_numChars]; // массив для хранения полученных данных
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
задержка (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
статический байт ndx = 0;
char endMarker = '\ n';
char rc;
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
if (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
if (ndx> = _numChars) {
ndx = _numChars - 1;
}
} еще {
_receivedChars [ndx] = '\ 0'; // завершаем строку
ndx = 0;
_newData = true;
}
}
}
voidparseSendCommands () {
if (_newData == true) {
constchar delim [2] = "";
char * токен;
токен = strtok (_receivedChars, разделитель);
char cmd = _receivedChars [0];
байтовый индекс = 0;
байтовое значение = 0;
int я = 0;
while (токен! = NULL) {
//Serial.println(token);
i ++;
switch (i) {
Дело 1:
токен = strtok (NULL, разделитель);
index = atoi (токен);
перерыв;
case2:
токен = strtok (NULL, разделитель);
if (токен! = NULL) {
значение = atoi (токен);
}
перерыв;
дефолт:
токен = NULL;
}
}
sendCmd (cmd, индекс, значение);
_newData = false;
}
}
voidsendCmd (char cmd, byte index, byte value) {
Serial.println ("-----");
Serial.println ("Отправка команды:");
Serial.println ("\ t" + String (cmd) + "" + String (индекс) + "" + String (значение));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // передаем на устройство
Wire.write (cmd); // отправляет символ
Wire.write (индекс); // отправляет один байт
Wire.write (значение); // отправляет один байт
Wire.endTransmission ();
байтовый ответ = 0;
bool hadResponse = false;
if (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
while (Wire.available ()) // ведомое устройство может отправить меньше, чем запрошено
{
hadResponse = true;
response = Wire.read ();
}
if (hadResponse == true) {
Serial.println ("Получение ответа:");
Serial.println (ответ);
}еще{
Serial.println («Нет ответа, проверьте адрес / соединение»);
}
}
}

просмотреть rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino, размещенный на ❤ на GitHub

Шаг 8: Дальнейшие действия

Периодически проверяйте наличие изменений в программном / аппаратном обеспечении.

Измените программное / аппаратное обеспечение в соответствии с вашими требованиями.

Комментируйте любые запросы / оптимизации.

Рекомендуемые: