Подключение GSM модема SIM900A mini v3.4.1

Для управления устройством по SMS я купил на Aliexpress GSM модем SIM900A mini v3.4.1.

SIM900A mini v3.4.1

Документация: SIM900_AT Command Manual_V1.03 SIM900_download procedure_V0.20 SIM900_Hardware Design_V2.00 SIM900A_schematic

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

Процесс перепрошивки описан здесь: http://alex-exe.ru/radio/wireless/gsm-sim900-firmwar-all-in-one/ и здесь http://arduino.ru/forum/apparatnye-voprosy/gsm-sim900a-delaem-iz-dvukh-diapazonov-chetyre.

Я использовал эту прошивку 1137B02SIM900M64_ST_ENHANCE и эту программу для ее загрузки SIM900 Series download Tools Develop 1.9. Подключение для загрузки прошивки:

Снимок экрана 2015-04-25 в 14.44.08

К сожалению на плате не было возможности легко подключиться к пинам PWRKEY и DEBUG. Они просто не были выведены. К тому же у меня почему-то нужно было пин PWRKEY не на землю сажать, а подавать на него 1. Плату паять не хотелось, поэтому я выкрутился следующим образом: положил под плату магнит от жесткого диска и пины от кабелей прилипли к нужным разъемам. На фотографиях ниже показано, как я это сделал.

IMG_0244

 

IMG_0241

IMG_0243

Подключение датчика расхода топлива

В качестве датчика я намереваюсь использовать следующее купленное на Aliexpress устройство:

IMG_0088

Модель: LP-GF24
RED — VCC
WHITE — GND
BLUE — DATA
2174 импульсов на 1 литр

Скорее всего оно было скопировано с этого устройства:

Снимок экрана 2015-02-01 в 23.29.15

В этом блоге ругают копию. На ebay можно купить оригинал. Попробую пока с тем датчиком, который уже купил. Импульсы он честно выдает, а как себя будет вести, когда будет подключен к топливопроводу — посмотрим.

Я подключил датчик ко второму пину Arduino Pro Mini, чтобы считать импульсы, приходящие от него. Для этого я буду обрабатывать прерывание 0. Уже в процессе сборки добавил подтягивающий вниз резистор 10k на второй пин, на схеме его нет.

Кабель к датчику нужен экранированный, я использовал FTP патч корд.

Снимок экрана 2015-04-25 в 14.19.43

//*****************************************************************
//* Инициализация подсистемы подсчета расхода топлива
//*****************************************************************
void setupFuelMeter(void) {
attachInterrupt(fuelMeterInt, ISRfuelMeter, RISING); // Разрешения прерывания
}

//*****************************************************************
//* Обработчик прерывания - импульс счетчика топлива
//*****************************************************************
void ISRfuelMeter(void) {
app.fuelPulsesAll.number++;
app.fuelPulsesLate.number++;
}

Переменные были определены как volatile:

volatile UnsignedLong_Bytes fuelPulsesAll; // Расход топлива в импульсах с момента установки счетчика
volatile UnsignedLong_Bytes fuelPulsesLate; // Расход топлива в импульсах с момента заправки

Подключение часов DS3231

Часы DS3231 обладают высокой точностью. Они подключаются к Arduino по протоколу I2C двумя проводами, плюс питание и земля. Подключение к Arduino Pro Mini: A4 — SDA, A5 — SCL, VCC — VCC, GND — GND. Datasheet можно посмотреть здесь DS3231.

Снимок экрана 2015-04-25 в 13.14.52

Я использовал библиотеку — DS3231RTC.h, скачать ее можно здесь https://github.com/trunet/DS3231RTC. Она используется совместно с библиотекой Time.h, последнюю версию можно взять здесь: https://github.com/PaulStoffregen/Time.

Примеры использования:

tmElements_t tm; // Структура для хранения времени
RTC.read(tm); // Чтение времени
RTC.write(tm); // Установка времени

Структура tmElements_t описана в Time.h:

typedef struct {
uint8_t Second;
uint8_t Minute;
uint8_t Hour;
uint8_t Wday; // day of week, sunday is day 1
uint8_t Day;
uint8_t Month;
uint8_t Year; // offset from 1970;
} tmElements_t, TimeElements, *tmElementsPtr_t;

Там же находятся полезные константы и функции. Среди них:

//convenience macros to convert to and from tm years 
#define  tmYearToCalendar(Y) ((Y) + 1970)  // full four digit year 
#define  CalendarYrToTm(Y)   ((Y) - 1970)
#define  tmYearToY2k(Y)      ((Y) - 30)    // offset is from 2000
#define  y2kYearToTm(Y)      ((Y) + 30)  

void breakTime(time_t time, tmElements_t &tm); // break time_t into elements
time_t makeTime(tmElements_t &tm); // convert time elements into time_t

Linux — создание аналога OS X Time Machine

Постановка задачи: есть NAS WD EX4 объемом 18T. Он используется для хранения данных дизайн студии. Соответственно на нем хранятся текущие проекты и завершенные проекты. Хочется делать ежедневный бэкап данных для возможности откатиться на несколько дней назад. Однако для бэкапа нашелся только диск 3T. Как просто бэкапить только последние данные? Смириться с возможной потерей архивных данных можно, но терять текущие проекты недопустимо. Переносить данные из рабочих каталогов в архивные неудобно. Хотелось бы сделать бэкап абсолютно прозрачным для пользователей, которые привыкли к одной структуре каталогов и не хотят ее менять. Для решения используется адаптированный скрипт, описанный в http://habrahabr.ru/post/149059/. Неудобство описанного скрипта в том, что он копирует исходный каталог целиком, а мне нужно выбрать файлы по дате изменения. Привожу скрипт с моими правками:

#!/bin/sh
date=`date "+%Y-%m-%d-%H%M%S"`

SRC=/mnt/ex4
DST=/backup

find $SRC -mtime -360 -type f > $DST/findlist
rsync -ax --link-dest=../Latest --files-from=$DST/findlist / $DST/Processing-$d$
cd $DST
mv Processing-$date $date
rm -f Latest
ln -s $date Latest

В принципе, ничего сложного нет. Есть только небольшие пояснения:
1) Вначале командой find формируется список файлов с датой изменения не более 360 дней, затем rsync копирует файлы из этого списка в каталог для бэкапа. Если файл уже был скопирован ранее, то создается жесткая ссылка. Это уменьшает время бэкапа и экономит место на диске.
2) Скрипт запускается по ночам cron-ом.

Датчик наличия напряжения в сети 220V

Вчера собрал и подключил к макету датчик наличия напряжения в сети. Он был собран по следующей схеме. Схема нарисована на онлай ресурсе Scheme-It.
Снимок экрана 2015-04-05 в 18.41.44

 

U1 и U2 — оптопара TLP504A (AOT101AC)
Q1 — KT3107A (BC308A)
R1 — 470K
R2 — 20K
R3 — 30K
R4 — 10K
C1 — 470mF

Левая половина схемы собрана внутри вилки, правая рядом с микроконтроллером. На выходе без конденсатора прямоугольные импульсы с частотой 100Hz. Конденсатор превращает их в логическую 1. При пропадании напряжения на выходе схемы появляется логический 0. На фото оптопара на плате.

IMG_0360

 

На следующей фотографии вилка в сборе.

IMG_0363

Обработка данных в программе.

#define LED_220 9 // HIGH - есть напряжение 220, LOW - нет

void setup() {
  pinMode(LED_220, INPUT);  // Установка пина для проверки напряжения сети
}

// В процедуре проверки
if (digitalRead(LED_220) == LOW) {
  // Обработка пропадания напряжения
}