Эксперимент 9. миксер

Содержание

Алгоритм

  • После подключения питания ничего не делаем пока не нажата кнопка «старт/сброс»;
  • Проверяем текущее количество очков. Если значение очков дошло до левой или правой границы интервала:
    • заканчиваем игру;
    • показываем светодиодом победителя;
    • переходим в режим ожидания нажатия кнопки «старт/сброс»;
  • Считываем данные с сенсоров;
  • Если значение сенсора первого игрока превысило порог:
    • отнимаем от общего числа очков единицу;
    • мигаем светодиодом об удачном прыжке;
    • если количество очков кратно 3, включаем «помпу 1» на 3 секунды. Если помпа в данный момент работает, добавляем к времени её работы ещё 3 секунды.
  • Если значение сенсора второго игрока превысило порог:
    • прибавляем к общему числу очков единицу;
    • мигаем светодиодом об удачном прыжке;
    • если количество очков кратно 3, включаем «помпу 2» на 3 секунды. Если помпа в данный момент работает, добавляем к её времени работы ещё 3 секунды.

Пояснения к коду

В этой программе мы создаем объект класса . Это встроенный класс, предназначенный для работы со строками, т.е. с текстом.

Не путайте его с типом данных , который является просто массивом символов. же позволяет использовать ряд методов для удобной работы со строками.

Мы знакомимся с новым видом циклов: цикл с условием

В отличие от цикла со счетчиком , цикл выполняется до тех пор, пока логическое выражение истинно.

Метод объекта возвращает количество байт, полученных через последовательный порт.

В данном эксперименте цикл работает до тех пор, пока возвращает ненулевое значение, любое из которых приводится к .

Переменные типа могут хранить один символ.

В этом примере символ мы получаем методом , который возвращает первый байт, пришедший на последовательный порт, или -1, если ничего не пришло.

Обратите внимание, что в мы сравниваем не пришедший символ с 0 и 9, но их коды. Если пришел какой-то символ, который не является цифрой, мы не будем его добавлять к нашей строке .

Объекты типа позволяют производить конкатенацию, т.е

объединение строк. Это можно сделать так: , но можно записать в сокращенной форме: .

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

Напомним, что последовательностью кодируется символ переноса строки. Если он был передан устройству, мы передаем полученные ранее символы как параметр для , которая включает светодиод.

Мы используем один из методов , , который заставляет считать строку не набором цифр, но числом. Он возвращает значение типа , при этом, если строка начинается с символа, не являющегося цифрой, будет возвращен 0. Если после цифр, идущих в начале строки, будут символы не-цифры, на них конверсия остновится.

Обратите внимание на выпадающее меню внизу монитора порта: чтобы наше устройство получало символ перевода строки, там должно быть выбрано «Новая строка (NL)»

Пустая строка обозначается так: . Опустошив ее, мы готовы собирать новую последовательность символов.

Язык программирования

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

Внимание! Для начала работы необходимо установить среду программирования Arduino IDE.

Arduino IDE является бесплатной программой, скачать которую может любой желающий. На нашем сайте вы можете скачать любую подходящую для вас версию среды. Также доступ к скачиванию IDE предоставлен на официальном сайте компании, а при желании, разработчиков можно отблагодарить, сделав денежный перевод.

Программу, написанную на языке программирования Ардуино называют скетчем. Готовые скетчи записываются на плату для их выполнения.

Среда IDE поддерживается такими операционными системами, как Windows, MacOs и Linux. На официальном сайте компании указанно, что данный язык программирования написан на Wiring, но на самом деле его не существует и для написания используется C++ с небольшими изменениями.

Компоненты и их описания

Arduino Uno

Arduino взаимодействует через датчики с окружающей средой и обрабатывает поступившую информацию в соответствии с заложенной в неё программой. Подробнее с платой Ардуино Уно можно ознакомиться здесь.

Ардуино Уно

Датчик влажности почвы

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

Датчик влажности почвы

Этот датчик может выполнять свою работу в цифровом и аналоговом режимах. В нашем проекте используется датчик в цифровом режиме.
На модуле датчика есть потенциометр. С помощью этого потенциометра устанавливается пороговое значение. Также на модуле установлен компаратор. Компаратор сравнивает данные выхода датчика с пороговым значением и после этого даёт нам выходной сигнал через цифровой вывод. Когда значение датчика больше чем пороговое, цифровой выход передаёт 5 вольт (HIGH), земля сухая. В противном случае, когда данные датчика будут меньше чем пороговые, на цифровой вывод передаётся 0 вольт (LOW), земля влажная.

Этим потенциометром необходимо отрегулировать степень сухости почвы, когда как вы считаете нужно начать полив.

Фоторезистор

Фоторезистор (LDR) — это светочувствительное устройство, которое используются для определения интенсивности освещения. Значение сопротивления LDR зависит от освещённости. Чем больше света, тем меньше сопротивление. Совместно с резистором, фоторезистор образует делитель напряжения. Резистор в нашем случае взяли 10кОм.

Делитель напряжения

Подключив выход делителя Uin к аналоговому входу Ардуино, мы сможем считывать напряжения на выходе делителя. Напряжение на выходе будет меняться в зависимости от сопротивления фоторезистора. Минимальное напряжение соответствует темноте, максимальное – максимальной освещённости.

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

Релейный модуль

Реле представляет собой переключатель с электромеханическим или электрическим приводом.

Релейный модуль

Привод реле приводится в действие небольшим напряжением, например, 5 вольт от микроконтроллера, при этом замыкается или размыкается цепь высокого напряжения.

Схема реле

В этом проекте используется 12 вольтовый водяной насос. Arduino Uno не может управлять напрямую насосом, поскольку максимальное напряжение на выводах Ардуино 5 вольт. Здесь нам приходит на помощь релейный модуль.

Релейный модуль имеет два типа контактов: нормально замкнутые и нормально разомкнутые контакты. Нормально замкнутые без управляющего напряжения замкнуты, при подаче напряжения размыкаются. Соответственно нормально разомкнутые без напряжения разомкнуты, при подаче управляющего напряжения замыкаются. В проекте используются нормально разомкнутые контакты.

Водяной насос

В проекте используем 12-и вольтовый погружной насос с 18-ваттным двигателем. Он может поднимать воду до 1,7 метра.

Водяной насос

Этот насос можно эксплуатировать только тогда, когда он полностью погружен в воду. Это налагает некие обязательства по контролю уровня воды в ёмкости. Если водяной насос будет работать без воды, он просто-напросто сгорит.

Макетная плата

Макетная плата представляет собой соединительную плату, используемую для создания прототипов проектов электроники, без пайки.

Скетч

p040_thermenvox.ino
// даём имена для пинов с пьезопищалкой (англ. buzzer) и фото-
// резистором (англ. Light Dependent Resistor или просто LDR)
#define BUZZER_PIN  3
#define LDR_PIN     A0
 
void setup()
{
  // пин с пьезопищалкой — выход...
  pinMode(BUZZER_PIN, OUTPUT);
 
  // ...а все остальные пины являются входами изначально,
  // всякий раз при подаче питания или сбросе микроконтроллера.
  // Поэтому, на самом деле, нам совершенно необязательно
  // настраивать LDR_PIN в режим входа: он и так им является
}
 
void loop()
{
  int val, frequency;
 
  // считываем уровень освещённости так же, как для
  // потенциометра: в виде значения от 0 до 1023.
  val = analogRead(LDR_PIN);
 
  // рассчитываем частоту звучания пищалки в герцах (ноту),
  // используя функцию проекции (англ. map). Она отображает
  // значение из одного диапазона на другой, строя пропорцию.
  // В нашем случае  -> . Так мы получим
  // частоту от 3,5 до 4,5 кГц.
  frequency = map(val, , 1023, 3500, 4500);
 
  // заставляем пин с пищалкой «вибрировать», т.е. звучать
  // (англ. tone) на заданной частоте 20 миллисекунд. При
  // cледующих проходах loop, tone будет вызван снова и снова,
  // и на деле мы услышим непрерывный звук тональностью, которая
  // зависит от количества света, попадающего на фоторезистор
  tone(BUZZER_PIN, frequency, 20);
}

Как собрать?

  1. Для начала вставьте сим-карту в GPRS Shield и установите его на платформу Iskra Neo.
  2. Подключите внешнюю антенну через SMA-разъём.
  3. На платах Arduino с микроконтроллером ATmega32U4 (Iskra Neo, Arduino Leonardo, Arduino ETH, Arduino Micro и Arduino Yún) пины и используются для протокола I²C. В GPRS Shield контакты и также по умолчанию находятся на пинах и . Чтобы избежать конфликта с I²C-гироскопом перебросим контакты и GPRS Shield’a на пины и . Для этого снимите джамперы с контактов и GPRS Shield’a. На их место воткните два провода «мама-мама».
  4. Присоедините к Troyka Shield контактные колодки и установите получившуюся конструкцию на GPRS Shield. Соединяем с помощью проводов «мама-мама» контакты и GPRS Shield’a с пинами и платы Iskra Neo соответственно.
  5. Используя два 3-проводных шлейфа подключите Troyka-гироскоп к Troyka Shield следующим образом:Контакты питания:
    1. Земля (G) — чёрный провод. Соединить с пином Troyka Shield.
    2. Питание (V) — красный провод. Соединить с пином Troyka Shield.
    3. Не используется.

    Контакты шины I²C:

  1. Сигнальный (D) — чёрный провод. Подключить к пину Troyka Shield.
  2. Сигнальный (С) — красный провод. Подключить к пину Troyka Shield.
  3. Не используется.

Используйте 3-проводной шлейф, чтобы подключить Troyka-светодиод к цифровому пину на Troyka Shield.

Теперь подключите динамик и микрофон в соответствующие разъёмы GPRS Shield.

Вставьте шесть NiMH аккумуляторов в батарейный отсек 3×2 AA. Через штекер питания 2,1 мм с клеммником подключите его к плате Iskra Neo.По итогу должна получиться следующая схема:

Теперь вам нужно упаковать устройство в плюшевого зверя. Для этого переверните игрушку спиной к себе, сделайте аккуратный надрез по шву и разместите всю электронику внутри. Проще сразу взять игрушку с молнией на спине, как у нас, иначе замаетесь штопать, и получите в итоге монстра Франкинштейна вместо милой зверушки.

Программная эмуляция

Платформа Arduino Nano Every с микроконтроллером ATmega4809 поддерживает программную эмуляцию для полной совместимости с платой предшественника Arduino Nano с микроконтроллером ATmega328.

  • Включение совместимости:
    Инструменты
    Registaers Emulation
    ATMEGA328
  • Отключение совместимости:
    Инструменты
    Registaers Emulation
    None (ATMEGA4809)

Эмуляция будет полезна, только если одновременно выполнены следующие пункты:

  1. Ваш проект собран на базовой плате Arduino Nano.
  2. Вы решили перейти с платы Arduino Nano на плату Arduino Nano Every.
  3. В коде прошивки использованы не базовые функции языка C++, а именно регистры микроконтроллера ATmega328.
  4. Вам лень менять код.

Во всех остальных случаях рекомендуем не включать эмуляцию.

Пояснения к коду

  • Очень часто бывает полезно обмениваться данными, например, с компьютером. В частности, для отладки работы устройства: можно, например, смотреть, какие значения принимают переменные.
  • В данном эксперименте мы знакомимся со стандартным объектом , который предназначен для работы с последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с данным объектом) , и , которые вызываются после точки, идущей за именем объекта:
    • чтобы обмениваться данными, нужно начать соединение, поэтому вызывается в
    • отправляет содержимое . Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек: . Кириллица, скорее всего, будет отображаться некорректно.
    • делает то же самое, только добавляет в конце невидимый символ новой строки.
  • В и можно использовать второй необязательный параметр: выбор системы счисления, в которой выводить число (это может быть , , , для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел.

Например,

Serial.println(18,BIN);
Serial.print(3.14159,3);

в мониторе порта даст результат

10010
3.142
  • Монитор порта, входящий в Arduino IDE, открывается через меню Сервис или сочетанием клавиш Ctrl+Shift+M. Следите за тем, чтобы в мониторе и в скетче была указана одинаковая скорость обмена данными, . Скорости 9600 бит в секунду обычно достаточно. Другие стандартные значения можете посмотреть в выпадающем меню справа внизу окна монитора порта.
  • Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.
  • При запуске монитора порта скетч в микроконтроллере перезагружается и начинает работать с начала. Это удобно, если вам нельзя упустить какие-то данные, которые начинаю передаваться сразу же. Но в других ситуациях это может мешать, помните об этом нюансе!
  • Если вы хотите читать какие-то данные в реальном времени, не забывайте делать хотя бы на 100 миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать. Вы можете отправлять данные и без задержки, а затем, к примеру, скопировать их для обработки в стороннем приложении.
  • Последовательность выводится как символ табуляции (8 пробелов с выравниванием). Также вы можете использовать, например, последовательность для перевода строки. Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же: .

Исходный код

guessTheCard.ino
#include <Servo.h>
#include <EasyVR.h>
 
 
EasyVR easyvr(Serial);
Servo* srv;
 
// Номер пина для светодиода, индицирующего ожидание команды
const int LED_WAIT = 13;
 
// Номер группы команд
enum
{
    GROUP_MAIN = 1,
};
 
// Коды команд из группы 1
enum
{
    G1_SHIRT = ,
    G1_PEAR = 1,
    G1_ORANGE = 2,
};
 
// Соответствие команд индексам в массиве серв srv
enum
{
    // Если значение элемента перечисления не задано, то оно принимается
    // равным <значение предыдущего элемента>+1. Если элемент первый, то ему
    // присваивается значение 0.
    SRV_SHIRT,
    SRV_PEAR,
    SRV_ORANGE,
    // Эту константу держите всегда последней и не меняйте её значение:
    SRV_COUNT
};
 
// Соостветствие серв пинам
enum
{
    SRV_SHIRT_PIN  = 3,
    SRV_PEAR_PIN   = 5,
    SRV_ORANGE_PIN = 6
};
 
 
void setup(void)
{
    Serial.begin(9600);
 
    // Переводим на запись порт для индикации
    // активности микрофона
    pinMode(LED_WAIT, OUTPUT);
    digitalWrite(LED_WAIT, LOW);
 
    // Ожидание соединения с платой
    while(!easyvr.detect()) delay(1000);
 
    // Установка таймаута на распознавание
    easyvr.setTimeout(5);
 
    // Выбор языка (Английский)
    easyvr.setLanguage(EasyVR::ENGLISH);
 
    // Конфигурируем сервы
    srv = new ServoSRV_COUNT;
 
    srv  SRV_SHIRT .attach(  SRV_SHIRT_PIN );
    srv SRV_ORANGE .attach( SRV_ORANGE_PIN );
    srv   SRV_PEAR .attach(   SRV_PEAR_PIN );
 
    // По очереди протестируем все сервы
    srvSRV_SHIRT.write(90);
    delay(1000);
    srvSRV_SHIRT.write();
 
    delay(1000);
 
    srvSRV_ORANGE.write(90);
    delay(1000);
    srvSRV_ORANGE.write();
 
    delay(1000);
 
    srvSRV_PEAR.write(90);
    delay(1000);
    srvSRV_PEAR.write();
}
 
 
// Данная функция вызывается в случае успешного
// распознавания фразы
void action(int8_t group, int8_t idx)
{
    // Активируем серву, соответствующую распознанному коду
    switch (group)
    {
    case GROUP_MAIN
        switch (idx)
        {
        case G1_SHIRT
            srvSRV_SHIRT.write(90);
            delay(1000);
            srvSRV_SHIRT.write();
            break;
        case G1_PEAR
            srvSRV_PEAR.write(90);
            delay(1000);
            srvSRV_PEAR.write();
            break;
        case G1_ORANGE
            srvSRV_ORANGE.write(90);
            delay(1000);
            srvSRV_ORANGE.write();
            break;
        }
        break;
    }
}
 
 
void loop(void)
{
    int8_t idx;
 
    // Зажигаем светодиод для индикации режима ожидания команды
    digitalWrite(LED_WAIT, HIGH);
 
    // Запускаем процедуру распознавания
    easyvr.recognizeCommand(GROUP_MAIN);
 
    // Ожидаем окончание процесса
    while(!easyvr.hasFinished());
 
    // Тушим светодиод - либо таймаут, либо команда распознана
    digitalWrite(LED_WAIT, LOW);
 
    // Если убрать эту задержку, то мы перестанем видеть, когда заканчивается
    // один период ожидания команды и начинается второй. Если произнесение команды
    // придётся на границу двух периодов, то распознавание закончится неудачей.
    delay(500);
 
    // Получаем код распознанной команды
    idx = easyvr.getCommand();
 
    if(idx >= )
    {
        // Выполним действие по команде
        action(GROUP_MAIN, idx);
    }
    else
    {
        // Ошибка распознавания или таймаут
    }
}

Распиновка

Пины питания

  • VIN: Входной пин для подключения внешнего источника напряжения в диапазоне от 7 до 12 вольт.
  • 5V: Выходной пин от с выходом 5 вольт и максимальным током 1 А. Регулятор обеспечивает питание микроконтроллера и другой обвязки платы.
  • 3V3: Выходной пин от с выходом 3,3 вольта и максимальным током 150 мА.
  • IOREF: Вывод предоставляет платам расширения информацию о рабочем напряжении микроконтроллера. В нашем случае рабочее напряжение платформы 5 вольт.
  • GND: Выводы земли.

Порты ввода/вывода

  • Пины общего назначения: 20 пинов: –
    Логический уровень единицы — 5 В, нуля — 0 В. К контактам подключены подтягивающие резисторы, которые по умолчанию выключены, но могут быть включены программно.
  • АЦП: 6 пинов: – / –
    Позволяет представить аналоговое напряжение в виде цифровом виде. Разрядность АЦП не меняется и установлена в 10 бит. Диапазон входного напряжения от 0 до 5 В, при подаче большего напряжения микроконтроллер может выйти из строя.
  • ШИМ: 6 пинов: , , и –
    Позволяет выводить аналоговое напряжение в виде ШИМ-сигнала из цифровых значений. Разрядность ШИМ не меняется и установлена в 8 бит.
  • I²C Для общения контроллера c платами расширения и сенсорами по интерфейсу I²C.I²C: пины SDA/18/A4 и SCL0/19/A5
  • SPI Для общения контроллера c платами расширения и сенсорами по интерфейсу SPI.SPI: пины MOSI/11, MISO/12 и SCK/13
  • Serial/UART Для общения контроллера c платами расширения и сенсорами по интерфейсу UART.Serial: пины TX1/1 и RX1/0. Контакты также соединены с соответствующими выводами сопроцессора ATmega16U2 для общения платы по USB. Во время прошивки и отладки программы через ПК, не используйте эти пины в своём проекте.

Алгоритм

  • Сразу после подачи питания проверяем есть ли связь с GPRS устройством.Если связи нет, повторяем запрос снова и ждём подтверждения связи.
  • Проверяем память сим-карты на наличие новых непрочитанных сообщений.Если их нет, повторяем запрос снова и снова.
  • Читаем сообщение и проверяем содержимое его текста:
    • Если включаем розетку и отчитываемся о включении обратным смс.
    • Если выключаем розетку и отчитываемся о выключении обратным смс.
    • Если отправляем обратное смс о состоянии розетки.
    • Если текст не распознан, отправляем обратное смс об ошибке распознавания команды.
  • Удаляем сообщение из памяти сим-карты

Как собрать

  1. Установите Troyka Shield на плату Arduino Uno.
  2. Приклейте макетную плату на Troyka Shield.
  3. Вставьте в макетную плату два резистора на и и скоммутируйте их следующим образом:
    1. Резистор соедините проводами «папа-папа» с цифровым пином Arduino.
    2. Резистор — с цифровым пином Arduino.
    3. Соедините ножки резисторов резисторов между собой.
  4. Возьмите RCA-разъём и подключите его центральный пин к точке соединения резисторов и . Внешний пин подключите к земле. Через этот разъём будем выводить видеосигнал.
  5. Возьмите второй RCA-разъём и подключите его к пину Arduino и к земле. Этот разъём будет передавать аудиосигнал.
  6. Подключите два потенциометра (Troyka-модуль) к Troyka Shield стандартными трёхпроводными шлейфами к аналоговым пинам и .должна получится такая схема:
  7. Для безопасности и красоты спрячьте управляющую электронику в корпус:
    1. Потенциометры упакуйте в #структор и подключите через герметичные разъёмы.
    2. Аналогично подключите кнопку старта игры. Используйте для этого пин .
    3. Разъёмы аудио/видео и питание устройства разместите на противоположной панели корпуса.

Консоль готова. Подключите её соединительным кабелем 2×RCA «папа-папа» (тюльпаны) к телевизору, берите друга и наслаждайтесь игрой.

Что ещё можно сделать с EasyVR?

Возможности платы EasyVR — огромны. Мы показали лишь самый простой пример
использования этого модуля. При этом было задействовано едва ли 30%
возможностей. Помимо распознавания голоса на английском языке модуль способен:

  1. Распознавать команды на некоторых других языках (Немецкий, Французский, Итальянский, Испанский, Корейский и Японский). Это даёт возможность строить устройства для обучения произношению иностранных слов на всех перечисленных языках.
  2. Воспользовавшись режимом «speaker-dependent можно собирать кодовые замки, отпираемые только по вашему голосу.
  3. Устройство также умеет распознавать коды тонового набора. Это даёт возможность разрабатывать исполнительные устройства, принимающие команды по проводной телефонной линии.

Как это собрать?

Мы будем использовать плату Arduino Uno как переходник USB→UART для начальной настройки EasyVR

Извлеките микросхему ATmega из платы Arduino Uno, чтобы она не вклинивалась в канал UART.

Внимание!

При извлечении микросхемы убедитесь, что питание платы отключено.

Установите на Arduino Uno шилд EasyVR.

Установите перемычку на EasyVR в положение .

Создайте три команды и обучите их. Временно снимите EasyVR-шилд, поставьте обратно микросхему на Arduino Uno.

Установите перемычку на EasyVR в положение .

Установите на EasyVR плату Тройка-шилд

Подключите сервоприводы к тройка-шилду, закрепите карточки на сервоприводах при помощи скрепок или проволоки. Установите сервоприводы так, чтобы в исходном положении карточки стояли.

Подключите питание.

Пример работы для Arduino и XOD

В качестве мозга для считывания показаний с датчика рассмотрим платформу из серии Arduino, например Arduino Uno.

  • Как начать работу с Arduino?
  • Как начать работу с XOD?

Схема устройства

Подключите датчик влажности почвы к аналоговому пину платформы Arduino. Для коммуникации понадобятся
соединительные провода «мама-папа».

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.

Код для Arduino IDE

Прошейте платформу Arduino скетчем приведённым ниже.

sensor-soil-moisture-capacitive-arduino-read-data.ino
// любой GPIO пин с поддержкой АЦП
constexpr auto pinSensor = A0;
 
void setup() {
  // открываем Serial-порт
  Serial.begin(9600);
}
 
void loop() {
  // считываем данные с датчика влажности почвы
  int valueSensor = analogRead(pinSensor);
  // выводим данные в Serial-порт
  Serial.println(valueSensor);
  // ждём 100 мс
  delay(100);
}

После загрузки скетча, в Serial-порт будут выводиться текущие показания сенсора в 10-битном диапазоне.

  • 0–300: сухая почва;
  • 300–600: влажная почва;
  • 600–750: датчик в воде.

Патч для XOD

  1. Создайте новый патч
  2. Добавьте в патч ноду и установите ей в инспекторе PORT значение .
  3. Добавьте ноду и подключите её к ноде к пину .
  4. Прошейте платформу Arduino с режимом отладки.

После загрузки прошивки, в отладочной ноде будут выводиться текущие показания сенсора в диапазоне от 0 до 0,75:

  • 0–0,3: сухая почва;
  • 0,3–0,6: влажная почва;
  • 0,6–0,75: датчик в воде.

Скетч

p180_lcd.ino
// Подключаем библиотеку для работы с жидкокристаллическим
// экраном (англ. Liquid Crystal Display или просто LCD)
#include <LiquidCrystal.h>
// на диоде, защищающем от неверной полярности, падает доля
// напряжения (англ. voltage drop). Необходимо это учитывать
#define DIODE_DROP  0.7 
// Объявляем объект, для управления дисплеем. Для его создания
// необходимо указать номера пинов, к которым он подключен в
// порядке:       RS   E DB4 DB5 DB6 DB7
LiquidCrystal lcd(13, 12, 11, 10,  9,  8);
 
void setup() 
{
  // начинаем работу с экраном. Сообщаем объекту количество
  // строк и столбцов. Опять же, вызывать pinMode не требуется:
  // функция begin сделает всё за нас
  lcd.begin(16, 2);
  // печатаем сообщение на первой строке
  lcd.print("Battery voltage:");
}
 
void loop() 
{
  // высчитываем напряжение подключенной батарейки
  float voltage = analogRead(A0)  1024.0 * 10.0;
  // если напряжение на делителе напряжения было зафиксировано,
  // нужно прибавить напряжение на диоде, т.к. оно было съедено
  if (voltage > 0.1)
    voltage += DIODE_DROP;
  // устанавливаем курсор, колонку 0, строку 1. На деле — это
  // левый квадрат 2-й строки, т.к. нумерация начинается с нуля
  lcd.setCursor(, 1);
  // печатаем напряжение в батарейке с точностью до сотых долей
  lcd.print(voltage, 2);
  // следом печатаем единицы измерения
  lcd.print(" Volts");
}

5. Загрузка первого скетча

Среда настроена, плата подключена. Пора прошивать платформу.

Arduino IDE содержит большой список готовых примеров, в которых можно быстро подсмотреть решение какой-либо задачи.

  1. Откройте распространенный пример — «Blink»:
    Файл
    Примеры
    01.Basics
    Blink.
  2. Откроется окно с демонстрационным примером.
  3. Немного модифицируйте код, чтобы увидеть разницу с заводским миганием светодиода. Замените строчки:
      delay(1000);

    на:

      delay(100);

    Полная версия кода:

    blink.ino
    void setup() {
      // initialize digital pin LED_BUILTIN as an output
      pinMode(LED_BUILTIN, OUTPUT);
    }
     
    void loop() {
      // turn the LED on (HIGH is the voltage level)
      digitalWrite(LED_BUILTIN, HIGH);
      // wait for a second  
      delay(100);
      // turn the LED off by making the voltage LOW                    
      digitalWrite(LED_BUILTIN, LOW);
      // wait for a second
      delay(100);
    }
  4. Нажмите на иконку «Компиляция» для проверки кода на ошибки.
  5. Нажмите на иконку «Загрузка» для заливки на плату.
  6. После прошивки платформы светодиод «L» начнёт загораться и гаснуть каждые 100 миллисекунд — в 10 раз быстрее исходной версии. Это значит, что ваш тестовый код успешно загрузился и заработал. Теперь смело переходите к экспериментам на Arduino.

Работа программного обеспечения

Интерфейс DS5000

Программа, приведённая в Приложении, написана для взаимодействия DS5000 с DS1307 с помощью двухпроводного интерфейса. DS5000 запрограммирован с использованием макетной платы DS5000T фирмы Dallas Semiconductor, которая позволяет использовать ПК в качестве терминала ввода/вывода. Программные средства KIT5K поставляемые вместе с макетной платой DS5000T обеспечивают высокоуровневый интерфейс для загрузки программных приложений в DS5000 или установки его параметров через Program command. Программное обеспечение KIT5K содержит эмулятор терминала ввода/вывода, чтобы позволить пользователю запускать программные приложения в микроконтроллер DS5000, который связан с пользователем через COM порт ПК.

Исходный код DS1307

Первый раздел исходного кода, расположенный в Приложении, используется при конфигурации DS5000 для последовательного соединения с ПК. Также в начале кода находится подпрограмма MASTER_CONTROLLER, которая используется для управления демонстрационной программой.

Подпрограммы, которые следуют непосредственно за подпрограммой MASTER_CONTROLLER, являются драйверами низкого уровня и служат для управления двухпроводным интерфейсом. Они не являются индивидуальными для DS1307, а могут быть использованы с любым совместимым с двухпроводным интерфейсом «ведомым» устройством. Вот эти подпрограммы:

SEND_START

Подпрограмма используется для генерации состояния START на двухпроводной шине.

SEND_STOP

Подпрограмма используется для генерации состояния STOP на двухпроводной шине.

SEND_BYTE

Подпрограмма посылает 8-разрядное слово (первым является старший значащий бит (MSB)) по двухпроводной шине и девятый тактовый импульс для импульса подтверждения приёма.

READ_BYTE

Подпрограмма читает 8-разрядное слово с двухпроводной шины. Она проверяет очищен ли флаг LASTREAD после того, как считан последний байт из «ведомого» устройства. Если это был не последний байт, то DS5000 посылает импульс подтверждения по девятому тактовому импульсу, а если это был последний считанный байт из «ведомого» устройства, то DS5000 посылает «неподтверждение».

SCL_HIGH

Подпрограмма осуществляет переход линии SCL из низкого в высокое состояние и обеспечивает высокое состояние линии SCL перед продолжением.

DELAY и DELAY_4

Эти две подпрограммы включены для обеспечения сохранения временной диаграммы двухпроводной шины.

Остальная часть кода, включённая в приложение, специально предназначена для демонстрации функций DS1307. Продемонстрированы следующие функции:

Setting Time

Время считывается с клавиатуры и сохраняется в сверхоперативной памяти DS5000. Затем оно передаётся по двухпроводной шине в DS1307.

Set RAM

Одиночный байт в шестнадцатеричном виде считывается с клавиатуры и записывается в RAM DS1307.

Read Date/Time

Дата и время считываются по двухпроводной шине и сохраняются в сверхоперативной памяти DS5000. Затем они выводятся на экран. Это продолжается до тех пор, пока не будет нажата кнопка на клавиатуре.

OSC On/OSC Off

Тактовый генератор DS1307 может быть включен или выключен.

SQW/OUT On/SQW/OUT Off

Функция SQW/OUT может быть включена или выключена. Она будет переключаться на частоте 1 Гц.

Таблица 1. AC электрические характеристики

Параметр Символ Эффективноезначение Единицы
Тактовая частота SCL fSCL 59 кГц
Время свободного состояния шины между состояниями STOP и START tBUF 5.7 мкс
Время удержания(повторенного) состояния START tHD:STA 6.2 мкс
Период низкого состояния тактового импульса SCL tLOW 10.5 мкс
Период высокого состояния тактового импульса SCL tHIGH 6.5 мкс
Время установки для повторного состояния START tSU:STA 5.3 мкс
Время удержания данных tHD:DAT 5.5 мкс
Время установки данных tSU:DAT 3.1 мкс
Время установки для состояния STOP tSU:STO 5.4 мкс

Заключение

Было показано, как правильно подсоединять напрямую DS1307 или любое двухпроводное «ведомое» устройство к 8051-совместимому микроконтроллеру. Соединение должно быть таким, чтобы временная диаграмма двухпроводного интерфейса на микроконтроллере не нарушалась драйверами низкого уровня. Для этого в программный код должны быть включены подпрограммы задержки. Приведённых в таблице 1 эффективных значений, придерживались при конфигурации аппаратной части, описанной в данном техническом руководстве.

Документация

Rus Пример программы на языке Асемблер
100 Kb Engl Исходный фаил
Rus Описание интерфейса I2C
Програмное обеспечение микроконтроллеров MCS-51
200 Kb Engl Описание DS1307 — часы реального времени с IIC интерфейсом

Главная —
Микросхемы —
DOC —
ЖКИ —
Источники питания —
Электромеханика —
Интерфейсы —
Программы —
Применения —
Статьи