Автоматизируем систему капельного полива

Элементы платы

Микроконтроллер STM32F405RG

Сердце платформы Iskra JS — 32-разрядный микроконтроллер STM32F405RG от STMicroelectronics с вычислительном ядром ARM Cortex M4.

Выбор питания

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

  • — внешнее питание сначала проходит регулятор на 5 В, а он в свою очередь питает регулятор на 3,3 В. Работают обе шины: 5V и 3.3V. Допустимое входное напряжение в этом случае — от 7 до 15 вольт.
  • — внешнее питание сразу подаётся на регулятор 3,3 В. Шина 5V не используется для получения 3,3 В. Допустимое входное напряжение — от 3,6 до 12 вольт. Используйте это положение, чтобы питать схему от одного Li-Ion аккумулятора.

Регулятор напряжения 5 В

Когда плата подключена к внешнему источнику питания, и джампер выбора питания установлен в положении , напряжение проходит через стабилизатор MC7805BD. Выход стабилизатора соединён с пином 5V. Максимальный выходной ток составляет 1000 мА.

Регулятор напряжения 3,3 В

Стабилизатор MC33275ST с выходом 3,3 вольта, обеспечивает питание микроконтроллера STM32F405RG. Максимальный выходной ток составляет 300 мА.

Светодиодная индикация

Имя светодиода Назначение
BUSY Информационный светодиод. Загорается, когда плата выполняет действия.
LED1 Светодиод свободного назначения.
ONИнформационный светодиод о наличии питания на микроконтроллере.

Разъём SPI

Некоторые платы расширения работают через интерфейс SPI. По стандарту Arduino R3 разъём SPI должен быть выведен в виде разъёма 3×2 штырька в этом месте. Iskra JS следует этому стандарту.

SPI-разъем не предназначен для внутрисхемного программирования микроконтроллера STM32F405RG и может использоваться только для связи с другими SPI-устройствами.

Разъём SWD

SWD-разъём предназначен для внутрисхемного программирования микроконтроллера STM32F405RG через программатор, например, ST-Link.

Пин BOOT0

Если замкнуть эту пару пинов, плата загрузится в DFU-режиме. Это позволит перепрошить микроконтроллер без программатора, через USB.

Настройка Arduino IDE на работу с платой Arduino Leonardo ETH

  1. Зайдите в директорию, где установлена Arduino IDE. В стандартной установке она находиться по адресу .
  2. Далее зайдите в поддиректорию среды Arduino IDE по адресу .
  3. Найдите в ней файл и откройте его с помощью любого текстового редактора.
  4. Добавьте в него текст, приведённый ниже.

    ##############################################################
     
    leonardoeth.name=Arduino Leonardo ETH
    leonardoeth.vid.0=0x2a03
    leonardoeth.pid.0=0x0040
    leonardoeth.vid.1=0x2a03
    leonardoeth.pid.1=0x8040
     
    leonardoeth.upload.tool=avrdude
    leonardoeth.upload.protocol=avr109
    leonardoeth.upload.maximum_size=28672
    leonardoeth.upload.maximum_data_size=2560
    leonardoeth.upload.speed=57600
    leonardoeth.upload.disable_flushing=true
    leonardoeth.upload.use_1200bps_touch=true
    leonardoeth.upload.wait_for_upload_port=true
     
    leonardoeth.bootloader.tool=avrdude
    leonardoeth.bootloader.low_fuses=0xff
    leonardoeth.bootloader.high_fuses=0xd8
    leonardoeth.bootloader.extended_fuses=0xcb
    leonardoeth.bootloader.file=caterinaCaterina-LeonardoEthernet.hex
    leonardoeth.bootloader.unlock_bits=0x3F
    leonardoeth.bootloader.lock_bits=0x2F
     
    leonardoeth.build.mcu=atmega32u4
    leonardoeth.build.f_cpu=16000000L
    leonardoeth.build.vid=0x2a03
    leonardoeth.build.pid=0x8040
    leonardoeth.build.usb_product="Arduino Leonardo ETH"
    leonardoeth.build.board=AVR_LEONARDO
    leonardoeth.build.core=arduino
    leonardoeth.build.variant=leonardo
    leonardoeth.build.extra_flags={build.usb_flags}
     
    ##############################################################
  5. Перезапустите Arduino IDE.

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

  1. Несмотря на золочение, контакты сенсора влажности со временем корродируют. Быстрее всего корродирование происходит при подключённом питании. Срок жизни сенсора можно значительно увеличить, если подключить питание к нему через силовой ключ. Когда надо получить данные — включаем питание сенсора, снимаем показания и тут же выключаем питание.
  2. Если оставить наш ирригатор работающим на длительный срок без присмотра, вода в резервуаре может закончиться. При работе без воды помпа быстро выходит из строя. Решением проблемы может быть автоматическое определение опустошения резервуара. Сенсор подбирается исходя из типа резервуара. Если он не глубок, то подойдёт ещё один датчик влажности. Когда же высоты его не хватает, можно воспользоваться УЗ-дальномером, сделать поплавок с датчиком наклона или просто опустить на дно два провода.
  3. Устройство, работающее от батареек, будет значительно безопасней питающегося от сети. Идеальным вариантом было бы питание ирригатора от батареек. Но Arduino Uno, как известно, даже в режиме сна потребляет более 10 мА. Выходом может являться использование Arduino Mini, способный в режиме сна снижать потребляемый ток до сотен мкА.
  4. Существует много правил полива домашних растений, как, например: не стоит поливать зимой вечером. Можно добавить сенсоров света или часы реального времени и скорректировать программу так, чтобы она старалась поливать в нужное время.

А ещё можно собрать автополив на Slot Shield — инструкция по сборке и прошивка.

Эксперименты

1

На старт, внимание, Wi-Fi!. Научимся подключать свои устройства к Wi-Fi сети

Для доступа к Wi-Fi воспользуемся специальным модулем. Он общается с Arduino по протоколу UART.

Научимся подключать свои устройства к Wi-Fi сети. Для доступа к Wi-Fi воспользуемся специальным модулем. Он общается с Arduino по протоколу UART.

Все хинты по работе с модулем читай в техническом описании.

AT

AT+CWMODE_DEF=3

AT+CWLAP

AT+CWJAP="SSID","password"

AT+CIFSR

AT+CIPMUX=1

AT+CIPSERVER=1,80

AT+CIPSERVER=0,80

AT+UART_DEF=9600,8,1,0,0

2. Удалённый термометр.

2_theremometer.ino
#include "ESP8266.h"
#include <SoftwareSerial.h>
#include <math.h>
 
#define SSID     "имя_твоего_Wi-Fi"
#define PASSWORD "пароль_твоего_Wi-Fi"
#define TEMP_PIN A0
 
SoftwareSerial mySerial(4, 5);
ESP8266 wifi(mySerial);
String name = "твой_ключ";
 
void setup(void) {
  Serial.begin(9600);
  if (wifi.joinAP(SSID, PASSWORD)) {
    Serial.println("https://dweet.io/follow/" + name);
  } else {
    Serial.println("Wi-Fi connection error");
  }
}
 
void loop(void) {
  float v_temp = 1023.0  analogRead(TEMP_PIN) - 1.0;
  float temp = 1.0  ( -log(v_temp)  3977.0
                            + 1.0  295.0 ) - 273.0;
  if (wifi.createTCP("www.dweet.io", 80)) {
    String data = "GET /dweet/for/" + name + "?";
    data += "temp=" + String(temp) + " HTTP/1.1\r\n";
    data += "Host: dweet.io\r\n\r\n";
    wifi.send(data.c_str(), data.length());
    wifi.releaseTCP();
  } else {
    Serial.println("create TCP error");
  }
  delay(1000);
}

3. Система регистрации данных

Будем снимать показания с датчиков температуры и освещённости и записывать их в файл на microSD-карточке. Мы будем использовать формат .csv, понятный для Microsoft Excel и подобных программ. Так мы сможем с легкостью строить графики и следить, как меняются температура и освещённость в течение больших периодов времени.

3_registrator.ino
#include <SPI.h> 
#include <SD.h> 
#include <math.h> 
 
#define LIGHT_PIN A3
#define TEMP_PIN A2
#define CS 8
 
void setup() {
  Serial.begin(9600);
 
  if (!SD.begin(CS)) {
    Serial.println("initialization failed!");
    return;
  }
}
 
void loop() {
  float r_light = 10.0
             (1023.0  analogRead(LIGHT_PIN) - 1.0);
  float light = 10.0 * pow(14.0  r_light, 1.6);
  float v_temp = 1023.0  analogRead(TEMP_PIN) - 1.0;
  float temp = 1.0  ( -log(v_temp)  3977.0
                             + 1.0  295.0 ) - 273.0;
  String data = String(millis()  1000) + ";"
                + String(light) + ";" + String(temp);
  data.replace(".", ",");
  Serial.println(data);
 
  File logFile = SD.open("log.csv", FILE_WRITE);
  logFile.println(data);
  logFile.close();
 
  delay(1000);
}

4. Напоминальник

4_reminder.ino
#include "ESP8266.h"
#include <SoftwareSerial.h>
 
#define SSID        "имя_твоего_Wi-Fi"
#define PASSWORD    "пароль_твоего_Wi-Fi"
#define BTN_PIN     12
 
SoftwareSerial mySerial(4, 5);
ESP8266 wifi(mySerial);
boolean buttonWasUp = true;
String maker_ID = "id_компонента_webhooks";
 
void setup(void) {
  Serial.begin(9600);
  if (wifi.joinAP(SSID, PASSWORD)) {
    Serial.println("I'm ready! Press the button.");
  } else {
    Serial.println("Wi-Fi connection error");
  }
}
 
void loop(void) {
  boolean buttonIsUp = digitalRead(BTN_PIN);
  if (buttonWasUp && !buttonIsUp) {
    delay(10);
    buttonIsUp = digitalRead(BTN_PIN);
    if (!buttonIsUp) {
      sendEmail();
      Serial.println("Notification has been sent");
    }
  }
  buttonWasUp = buttonIsUp;
}
 
boolean sendEmail() {
  if (wifi.createTCP("maker.ifttt.com", 80)) {
    String value1 = "Hello!";
    String request = "GET /trigger/feed/with/key/"
             + maker_ID + "?value1=" + value1
			 + " HTTP/1.1\r\n";
    request += "Host: maker.ifttt.com\r\n\r\n";
    wifi.send(request.c_str(), request.length());
    wifi.releaseTCP();
  } else {
    Serial.println("create tcp error");
  }
}

Стандартные для JavaScript

atob(base64string)

Декодирует строку из кодировки Base 64 в строку с двоичными данными. Параметр и результат имеют тип .

>atob("AAECAw==");
="\x00\x01\x02\x03"

btoa(binaryData)

Кодирует строку с двоичными данными в кодировку Base 64. Параметр и результат имеют тип .

>btoa("\x00\x01\x02\x03");
="AAECAw=="

changeInterval(id, time)

Изменяет период интервальной функции.

  • — идентификатор, который вернул ;
  • — новый период в миллисекундах.
var id = setInterval(function() { print('Hello'); }, 1000); // каждую секунду
// ...
changeInterval(id, 1500); // теперь каждые 1.5 секунды

Изменения вступают в силу с очередным вызовом функции-обработчика — таким образом изменения не моментальны.

clearInterval()

Останавливает работу интервальной функции. Параметр  — идентификатор, который вернул .

var id = setInterval(function() { print('Hello'); }, 1000); // каждую секунду
// ...
clearInterval(id);

Если опущен, будут остановлены все интервальные и отложенные функции.

clearTimeout()

Отменяет запуск отложенной функции. Параметр — идентификатор, который вернула .

var id = setTimeout(function() { print('Hello'); }, 1000); // через секунду
// ...
clearTimeout(id);

Если опущен, будут остановлены все отложенные и интервальные функции.

Исполняет код JavaScript, переданный в виде строки .

Возвращает результат последнего выполненного выражения из .

parseInt(string)

Преобразует строку в целое число.

Если задан определяет основание числа. По умолчанию используется десятичная система счисления.

Возвращает , если строка по содержимому не соответствует числу.

require(moduleName)

Загружает модуль (библиотеку) и возвращает объект, экспортируемый этим модулем.

Подробности приведены в статье об особенностях Iskra JS, а примеры использования функции рассмотрены в описаниях конкретных библиотек.

setInterval(callback, timeout)

Заставляет систему вызывать функцию или код переданный в виде строки каждые миллисекунд.

Вы можете передать один или несколько параметров, которые будут переданы как есть при вызове .

// Печатаем Hello каждую секунду
setInterval(function() {
  console.log('Hello');
}, 1000);
 
// То же самое
setInterval("console.log('Hello');", 1000);
 
// Печатаем значение пина каждые 100 мс
setInterval(function(pin) {
  console.log(analogRead(pin));
}, 100, A0);

возвращает число-идентификатор интервальной функции. Используйте его в качестве параметра , чтобы остановить процесс.

Если был разрешён режим глубокого сна (), а более 5000 мс, платформа может проспать время вызова на величину до 1 секунды. Это связано с тем, что необходимость пробуждения от глубокого сна платформа определяет раз в секунду.

setTimeout(callback, timeout)

Заставляет систему вызывать функцию или код переданный в виде строки через миллисекунд.

Вы можете передать один или несколько параметров, которые будут переданы как есть при вызове .

// Печатаем Hello через секунду
setTimeout(function() {
  console.log('Hello');
}, 1000);
 
// То же самое
setTimeout("console.log('Hello');", 1000);
 
// Печатаем значение пина через 100 мс
setTimeout(function(pin) {
  console.log(analogRead(pin));
}, 100, A0);

возвращает число-идентификатор отложенной функции. Используйте его в качестве параметра , чтобы отменить запланированный вызов.

Если был разрешён режим глубокого сна (), а более 5000 мс, платформа может проспать время вызова на величину до 1 секунды. Это связано с тем, что необходимость пробуждения от глубокого сна платформа определяет раз в секунду.

Исходный код

barrel.js
// подключаем модуль датчика уровня воды
var level = require('@amperka/water-level');
// подключаем датчик на дне бочки
var onBottom = level.connect(P1, {debounce 3});
// подключаем датчик на крышке бочки
var onTop = level.connect(P2, {debounce 3});
// подключаем реле
var pump = require('@amperka/relay').connect(P5);
// ожидаемая скорость потока воды в литрах в минуту
var normalSpeed = 10;
// создаем объект датчика потока жидкости
var flowSensor = require('@amperka/water-flow').connect(P3);
var flowSensorTimer = null;
 
var switchOn = function() {
  // включаем насос
  pump.turnOn();
  if (flowSensorTimer === null) {
    // каждые 2000 миллисекунд проверяем скорость воды
    flowSensorTimer = setInterval(function() {
      // если скорость потока меньше обычной
      var speed = flowSensor.speed('l/min');
      if (speed < normalSpeed) {
        // выключаем насос во избежание перегрева
        switchOff();
        print('overheat');
      }
    }, 2000);
  }
};
 
var switchOff = function() {
  // выключаем насос
  pump.turnOff();
  // выключаем опрос скорости потока
  if (flowSensorTimer !== null) {
    clearInterval(flowSensorTimer);
    flowSensorTimer = null;
  }
};
 
// если датчик на дне бочки опустился
if (onBottom.read() === 'down') {
  // включаем устройство
  switchOn();
  print('barrel is empty');
}
 
// событие: датчик на крышке бочки поднялся
onTop.on('up', function () {
  print('water level is high');
  // выключаем устройство
  switchOff();
});
 
// событие: датчик на дне бочки опустился
onBottom.on('down', function () {
  // включаем устройство
  switchOn();
  print('water level is low');
});

Как собрать?

  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.По итогу должна получиться следующая схема:

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

Исходный код

gsmbear.ino
// подключаем библиотеку для работы I²C
#include <Wire.h>
// подключаем библиотеку для работы с модулями IMU
#include <TroykaIMU.h>
 
// подключаем библиотеку для работы с GPRS устройством
#include <GPRS_Shield_Arduino.h>
// подключаем библиотеку для эмуляции Serial порта
// она нужна для работы библиотеки GPRS_Shield_Arduino
#include <SoftwareSerial.h>
 
#define GPRS_BUFFER_LENGTH    46
#define TELEPHONE_NUM_LENGTH  12
 
// порог скорости вращения гироскопа
#define ROTATE_SPEED_TRESHOLD 10
 
// время задержки, после которой будет совершён исходящий вызов
#define OUTCOMING_CALL_TIMEOUT 5000
 
// порог после которого будем звонить
#define OUTCOMING_CALL_TRESHOLD 500
 
// индикаторный светодиод расположен на 13 пине
#define INDICATOR_PIN 13
 
char fathersNumber = "+74993221317";
 
char incomingPhoneNumberGPRS_BUFFER_LENGTH;
 
// создаём объект класса GPRS, передаём ему
// номера пинов PK, ST и скорость 9600 бод
GPRS gprs(6, 5, 9600);
 
// создаём объект для работы с гироскопом
Gyroscope gyro;
 
unsigned long waitTime = ;
 
unsigned long rotateTime = ;
 
int rotateCounter = ;
 
void setup()
{
  //настраиваем пин 13 в режим выхода,
  pinMode(INDICATOR_PIN, OUTPUT);
  // подаём на пин 13 «низкий уровень»
  digitalWrite(INDICATOR_PIN, LOW);
  // включаем GPRS Shield
  gprs.powerUpDown();
 
  while (!gprs.init()) {
    // завелся ли GPRS Shield?
    digitalWrite(INDICATOR_PIN, !digitalRead(INDICATOR_PIN));
    // если связи нет, ждём 1 секунду
    // процесс повторяется в цикле,
    // пока не появится ответ от GPRS устройства
    delay(1000);
  }
  digitalWrite(INDICATOR_PIN, LOW);
 
  // запускаем гироскоп
  gyro.begin();
}
 
void loop()
{
  // если функция возвращает true
  if (gyroCall()) {
    // звоним на заданный в коде номер
    gprs.callUp(fathersNumber);
    // индикация звонка
    calling();
  }
  // каждую секунду ожидаем входящий звонок
  if (millis() - waitTime > 1000) {
    incomingCall();
    // запоминаем текущее время
    waitTime = millis();
  }
}
 
void incomingCall()
{
  // ожидаем звонка
  if (gprs.ifcallNow()) {
    // если поступает входящий звонок,
    // подаём на пин 13 «высокий уровень», чтобы
    // зажечь светодиод на 13 пине
    digitalWrite(INDICATOR_PIN, HIGH);
    // считываем номер входящего звонка
    gprs.isCallActive(incomingPhoneNumber);
    if (!strncmp(incomingPhoneNumber, fathersNumber, TELEPHONE_NUM_LENGTH)) {
      // если звонит папа
      // по истечении 3 секунд берём трубку
      delay(3000);
      gprs.answer();
      // индикация звонка
      calling();
    } else {
      // если нет, кладём трубку
      gprs.callEnd();
    }
  }
}
 
bool gyroCall()
{
  // считываем абсолютную скорость вращения гироскопа по трём осям
  float bearRotate = abs(gyro.readDegPerSecX())
  + abs(gyro.readDegPerSecY())
  + abs(gyro.readDegPerSecZ());
  // если это не случайные помехи
  if (bearRotate > ROTATE_SPEED_TRESHOLD) {
    // запоминаем текущее время
    rotateTime = millis();
    // увеличиваем счётчик вращения
    ++rotateCounter;
    // увеличиваем яркость светодиода
    analogWrite(INDICATOR_PIN, map(rotateCounter, , OUTCOMING_CALL_TRESHOLD, , 255));
 
  } else if (millis() - rotateTime > OUTCOMING_CALL_TIMEOUT) {
    // если же скорость вращение была ниже порога в течении 5 секунд
    // гасим светодиод
    digitalWrite(INDICATOR_PIN, LOW);
    // обнуляем счётчик вращения
    rotateCounter = ;
  }
  // возвращаем результат
  // превысил ли счётчик вращения порог срабатывания исходящего звонка
  return (rotateCounter > OUTCOMING_CALL_TRESHOLD);
}
 
void calling()
{
  while (!gprs.ifcallEnd()) {
    // моргаем и ждём пока абонент не положит трубку
    digitalWrite(INDICATOR_PIN, HIGH);
    delay(50);
    digitalWrite(INDICATOR_PIN, LOW);
    delay(200);
    digitalWrite(INDICATOR_PIN, HIGH);
    delay(50);
    digitalWrite(INDICATOR_PIN, LOW);
  }
}

Как собрать

  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 «папа-папа» (тюльпаны) к телевизору, берите друга и наслаждайтесь игрой.

Элементы платы

Дисплей

Экран выполнен на жидкокристаллической матрице, которая отображает две строки по 16 символов. Каждый символ состоит из отдельного знакоместа 5×8 пикселей. Матрица индикатора подключена к встроенному чипу ST7032, который выполняет роль посредника между экраном и микроконтроллером.

Подсветка дисплея

Сама по себе LCD-матрица не излучает свет, поэтому в корпус дисплейного модуля встроена LED-подсветка.

За включение и отключение подсветки отвечает сигнальный пин . А если контакт управляющей платы поддерживает ШИМ, то можно управлять яркостью подсветки.

Troyka-контакты

На дисплейном модуле выведено две пары Troyka-контактов.

Нижняя группа

  • Сигнальный (A) — пин управления подсветкой экрана. Подключите к аналоговому/цифровому пину микроконтроллера.
  • Питание (V) — соедините с рабочим напряжением микроконтроллера.
  • Земля (G) — соедините с землёй микроконтроллера.

Верхняя группа

  • Сигнальный (D) — пин данных шины I²C. Подключите к пину микроконтроллера.
  • Сигнальный (C) — пин тактирования шины I²C. Подключите к пину микроконтроллера.

Объекты-пины

Функциям и методам, которые принимают пины в качестве параметров, передают встроенные объекты-пины. Среди них есть синонимы. Используйте то обозначение, которое более уместно в конкретном контексте.

  • , , , … — соответствуют пинам, промаркированным на плате; это удобные синонимы к непосредственным портам микроконтроллера вида , ;
  • , , , … — также соответствуют маркировке на плате, но в то же время 1-в-1 совпадают с наименованием портов микроконтроллера;
  • , , , … , , , , … — непосредственные порты микроконтроллера, их соответствие с смотрите в документации на свою плату;
  • , , — пины подключенные к встроенным на плату светодиодам и кнопкам;

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

Как собрать?

Возьмите бочку и сделайте в ней 2 отверстия для датчиков уровня воды. Датчик максимального уровня должен находится в 10–15 сантиметрах от верхнего края, датчик минимального – примерно на середине бочки. Установите датчики в отверстия.

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

Возьмите датчик скорости потока жидкости и подключите к нему шланг от насоса. Шланг должен иметь на конце гайку с трубной резьбой ½ дюйма

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

К другой стороне датчика присоедините такой же шланг с гайкой на конце.

Возьмите Iskra JS и установите на неё Troyka Shield.

Подключите реле в форм-факторе тройка модуль через трехпроводной шлейф мама-мама к Troyka Shield к пину .

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

Проденьте в отверстия шлейфы от каждого датчика. Подключите шлейф от нижнего датчика уровня к пину , а верхнего — к пину . Шлейф датчика скорости потока жидкости подключите к пину .

Теперь подведите питание к компонентам устройства. Возьмите удлинитель с вилкой на конце и зафиксируйте контакты в клеммнике.

Аккуратно разберите блок питания на 5 Вольт. Подключите проводами питание 220 Вольт, а USB-кабель USB — к Iskra JS.

Возьмите настенную розетку. Разберите её, подведите к одному гнезду розетки провод от клеммника. Второй провод подключите через реле. Один провод на реле подключите к центральной клемме, а второй к клемме NC, что означает «нормально разомкнутый» — напряжение на розетке будет при установленном высоком логическом уровне на Iskra JS.

Закройте крышку герметичной коробки и закрепите её на бочке.

Подключите вилку насоса к розетке.

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

  1. Установите Troyka Shield на Arduino Uno

  2. Подключите датчик влажности почвы через Troyka Shield к аналоговому пину

  3. Подключите дисплей к управляющей плате через Troyka Shiled:

    1. Пин к пину Toyka Shield.
    2. Пины дисплея к разъёму на Troyka Shiled

  4. Подключите силовой ключ к контакту

  5. Подведите коммутирующее напряжение к силовому ключу в разъём и

  6. Подключите помпу к силовому ключу через клеммник с разъёмами и . В итоге должна получится схема.

  7. Воткните сенсор влажности почвы в землю.
  8. Другой конец шланга вставьте с водой в землю. Если горшок с землёй весит менее 2 кг, рекомендуется отдельно закрепить трубку, чтобы она не перевернула растение.
  9. Опустите помпу в ёмкость с водой.

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

Как собрать?

А вот и архив CorelDRAW векторных файлов для резки

Обрати внимание, что я исходил из конкретной толщины прозрачного аркила (2,93 мм) и допусков, которые варьируются от материала к материалу и модели лазера.

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

Чтобы светодиоды не засвечивали соседние пластинки в блоке цифр, сделаем панель из чёрного, непрозрачного акрила с отверстиями ограничивающими световой поток.

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

Сделаем площадку для адресных светодиодов так, чтобы каждый из них светил точно в световод пластинки с цифрой и оденем её на торчащие световоды

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

Распиновка светодиода WS2812B

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

Спаяй все светодиоды между собой как показано на схеме и подключи сигнальные провода к и пинам Iskra Mini.

Нажми на схему спайки если тебе ничего не видно.

Для точной работы часов к Iskra mini добавим модуль часов реального времени. Это удобно сделать если использовать Troyka Mini IO.

Подключим кнопку и потенциометр

Теперь питание и линии DI светодиодов

Восстановление прошивки Wi-Fi модуля

Mac OS

Скачай архив ESPTOOL_MAC.

Распакуй архив с программой для установки. При этом конечный путь к программе и файлу прошивки не должен содержать кириллических символов.

Открой терминал. Ты найдёшь его в
Finder
Программы
Служебные программы
Terminal
.

В терминале набери , нажми пробел и перенеси в окно терминала иконку папки с содержимым архива. Нажми .

Набери в терминале . Нажми .

Терминал запросит пароль — введи его и нажми .

Инструменты установлены. Осталось перепрошить модуль.

Узнай в Arduino IDE, к какому порту подключена твоя плата.

Набери в терминале команду для перепрошивки: python esptool.py —port ИМЯ_ПОРТА write_flash 0x00000 esp8266_AT_firmware.bin

Вместо «ИМЯ_ПОРТА» подставь порт из Arduino IDE (не забывая пропрямой слэш). Введи модуль в режим перепрошивки. Нажми в терминале.

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

Ты сможешь проверить его через Arduino IDE стандартными AT-командами, как в эксперименте «На старт, внимание, Wi-Fi!».

Windows

Подробную инструкцию по перепрошивке модуля Wi-Fi читай в .

  1. Скачай архив ESPTOOL_WIN.
  2. Распакуй архив с программой для установки. При этом конечный путь к программе и файлу прошивки не должен содержать кириллических символов.
  3. Запусти файл ESPFlashDownloadTool_v3.4.4.
  4. В появившемся окне выбери «ESP8266 DownloadTool».
  5. Укажи путь к файлу AT-прошивки «esp8266_AT_firmware.bin» (он лежит в том же архиве), отметь выбранный файл галочкой в чекбоксе напротив и укажи адрес 0х00, по которому будет записан файл в память модуля.
  6. Выбери СОМ порт, к которому подключён твой модуль, и установи Baud rate 115200.
  7. Настрой оставшиеся поля и чекбоксы:
  8. Переведи модуль в режим программирования.
  9. Теперь, когда модуль готов к прошивке, нажми кнопку «START» и дождись окончания процесса. Ура, модуль снова готов к работе!

Алгоритм

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

    • заканчиваем игру;
    • показываем светодиодом победителя;
    • переходим в режим ожидания нажатия кнопки «старт/сброс»;
  • Считываем данные с сенсоров;
  • Если значение сенсора первого игрока превысило порог:

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

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

Распиновка

— GPIO-пин на Iskra JS. Под этим именем вы можете обратиться к пину из программы.

— соответствующий пин на микроконтроллере STM32F405RG.

— пин питания.

— пин может генерировать ШИМ-сигнал.

— пин подключён к АЦП микроконтроллера, т.е. может считывать аналоговый сигнал.

— пин подключён к ЦАП микроконтроллера, т.е. может генерировать аналоговый сигнал.

— пин толерантен к 5 вольтам, т.е. выдерживает входной сигнал с напряжением, превышающим штатные 3,3 вольта.

— пин подключён к аппаратному интерфейсу SPI. также доступен в программе под псевдонимом .

— пин подключён к аппаратному интерфейсу I²C. доступен под псевдонимом .

— пин подключён к аппаратному интерфейсу UART/USART. доступен под псевдонимом .

На платах с компоновкой «xDuino Rev3» по одному интерфейсу SPI, I²C, UART, физически расположенных на определённых пинах, условно считаются основными. Через них обычно работают платы расширения. Для удобства программирования этим интерфейсам даны альтернативные имена вида

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

Стандартный JavaScript

  • Встроенные функции и константы — константы и функции
  • Array, Boolean, Function, Number, Object, String — примитивы
  • ArrayBuffer — типизированые массивы, ArrayBuffer, DataView, ArrayBufferView
  • Error, , , , — ошибки
  • Date — работа с датами и временем
  • JSON — кодирование и декодирование JSON
  • Math — математические функции

Классы и объекты, уникальные для Espruino и Iskra JS

  • E — утилитарные функции Espruino
  • Pin — работа с портами ввода-вывода (пинами)
  • File — чтение и запись файлов
  • SPI — работа с интерфейсом SPI
  • I2C — работа с интерфейсом TWI/I²C
  • Serial — работа с интерфейсом UART
  • OneWire — работа с шиной 1-Wire

Встроенные библиотеки Espruino и Iskra JS

  • crypto — работа с криптографией
  • Flash — прямые чтение и запись флеш-памяти контроллера
  • fs — работы с файловой системой карт памяти

Подгружаемые библиотеки

  • @amperka/accelerometer — драйвер акселерометра
  • @amperka/analog-line-sensor — драйвер аналогового сенсора пересечения линии
  • @amperka/animation — плавное изменение параметров
  • @amperka/barometer — драйвер барометра
  • @amperka/bluetooth — драйвер bluetooth-модуля
  • @amperka/button — драйвер модуля-кнопки и других кнопок
  • @amperka/buzzer — драйвер модуля-зуммера
  • @amperka/card-reader — расширение библиотеки fs для работы с SD картами
  • @amperka/digital-line-sensor — драйвер цифрового сенсора пересечения линии
  • @amperka/dweetio — клиент для работы с графиками в dweet.io
  • @amperka/gas-sensor — драйвер датчиков газа
  • @amperka/gpio-expander — драйвер GPIO expander
  • @amperka/gprs-shield — драйвер GPRS-модуля
  • @amperka/hysteresis — фиксация пересечения пороговых значений
  • @amperka/ifttt-webhooks — клиент для компонента webhooks сервиса ifttt.com
  • @amperka/ir-receiver — драйвер модуля инфракрасного приёмника
  • @amperka/led — драйвер модуля-светодиода и других светодиодов
  • @amperka/led-matrix — драйвер светодиодной матрицы 8×8
  • @amperka/led-strip — драйвер светодиодной ленты
  • @amperka/light-sensor — драйвер модуля сенсора освещённости
  • @amperka/magnetometer — драйвер магнитометра (компаса)
  • @amperka/motor — драйвер для контроллера двигателей
  • @amperka/multiservo — драйвер для контроллера сервоприводов
  • @amperka/nfc — драйвер RFID/NFC сканера
  • @amperka/pot — драйвер модуля-потенциометра
  • @amperka/pid — ПИД-регулятор
  • @amperka/power-control — управление транзистором
  • @amperka/proximity — драйвер датчика приближения и освещённости
  • @amperka/quaddisplay — драйвер для работы с четырёхразрядным индикатором (v1)
  • @amperka/quaddisplay2 — драйвер для работы с четырёхразрядным индикатором (v2)
  • @amperka/ringtone — проигрывание мелодий в формате Nokia RTTTL
  • @amperka/relay — драйвер для работы с реле
  • @amperka/robot-2wd — драйвер двухколёсного робота
  • @amperka/rs-485 — драйвер для работы с модулей RS-485
  • @amperka/rtc — драйвер для работы с часами реального времени
  • @amperka/servo — драйвер хобби-сервомоторов
  • @amperka/stepper — драйвер шагового двигателя
  • @amperka/telegram — телеграм-бот
  • @amperka/thermometer — драйвер для модуля аналогового линейного термометра
  • @amperka/timer — периодически повторяющиеся и отложенные действия
  • @amperka/ultrasonic — драйвер для ультразвукового дальномера HC-SR04
  • @amperka/usb-keyboard — эмуляция HID-устройства USB-клавиатуры
  • @amperka/water-flow — драйвер датчика потока воды
  • @amperka/water-level — драйвер датчика уровня воды
  • @amperka/wifi — драйвер модуля Wi-Fi

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

Вы так же можете создать свою библиотеку и подключить её к Espruino Web IDE

Оцените статью:
Оставить комментарий
Adblock
detector