31.10.10

Погодная станция на Ардуино

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


До погодной станции еще далеко. Пока что просто посмотрим как получать данные с датчиков температуры, давления и влажности.

Итак, в ролях:
  • Arduino Duemillanove
  • BMP085 от Bosch Sensortec - датчик давления и температуры
  • HIH-4030 от Honeywell - датчик влажности

Датчик влажности прост и незамысловат - подаете на него 5 вольт и получаете напряжение, линейно зависящее от влажности.
Датчик давления и температуры сложнее, он подключается по шине I2C и, кроме того,  использует для питания 3.3V.

Итак собираем схему.
Датчик влажности подключаем к земле и питанию, ногу out подключаем к аналоговому входу №0 ардуино.

Датчик давления подключаем к земле и питанию 3.3 вольта, выходы SDA и SLC подключаем к аналоговым входам 4 и 5 соответственно.

Для получения значения влажности нам понадобятся некоторые константы, которые можно найти в даташите на HIH-4030:


static const int offset = 958;
static const int slope_coef = 10;
static const int slope = 307;

offset - напряжение, соответствующее нулевой относительной влажности, а slope - соотношение между напряжением и влажностью, составляющий 30.68 mV. Поскольку я собираюсь использовать только целочисленную арифметику, то slope заведем как 307 и добавим дополнительный делитель 10.

Функция получения относительной влажности будет выглядеть так:


int get_humidity() {
   long voltage = analogRead(0); // получить значение 0..1023
   voltage = voltage * 5000 / 1023; // преобразовать в микровольты
   // вычислим относительную влажность в процентах
   return ((voltage - offset) * slope / slope_coef) / 100;
}

Код для работы с BMP085 я стянул тут. Имейте в виду, у меня этот код не заработал сразу из-за путаницы с использованием типов int, unsigned int и long. Работающий код можно взять из репозитория на bitbucket.org или из zip-файла в конце статьи.

Для удобства все функции для работы с датчиками удобно собрать в библиотеку. Библиотека в IDE Arduino - это папка с файлами, лежащая в каталоге libraries в каталоге arduino. Библиотека содержит как минимум два файла - заголовочный h-файл и cpp-файл с кодом.

Я сделал такой заголовочный файл:


/*
Library of utility classes and functions for Arduino weather station
*/

#ifndef WEATHER_H
#define WEATHER_H

#include "WProgram.h"

// interface for humidity sensor HIH-4030
class Humidity {
  private:
    static const int offset = 958;
    static const int slope_coef = 10;
    static const int slope = 307;

    int pin;
  public:
    Humidity(const int pin = 0);

    // returns relative humidity in percents * 10
    // to get actual humidity delete results by ten
    long get_humidity();

    int get_humidity_int();
};

#define I2C_ADDRESS 0x77
#define DEFAULT_OVERSAMPLING 3

class TemperaturePressure {
  private:
    int i2c_address;
    unsigned char oversampling_setting; //oversamplig for measurement

    static const unsigned char pressure_waittime[];// = { 5, 8, 14, 26 };

    //taken straight from the BMP085 datasheet
    int ac1, ac2, ac3;
    unsigned int ac4, ac5, ac6;
    int b1, b2, mb, mc, md;

    int _temp;
    long _pressure;

    void get_calibration_data();
 
    int read_int_register(unsigned char reg);
    char read_register(unsigned char reg);
    void write_register(unsigned char reg, unsigned char value);

    unsigned int read_ut();
    long read_up();

    void read_temperature_and_pressure();
  public:
    TemperaturePressure();
    TemperaturePressure(const int i2c_address, const int oversampling);

    void read_data_from_sensor();

    int get_temperature();
    long get_pressure();

    long get_pressure_hg();

    void begin();
};

#endif

Как видно, библиотека содержит два класса - Humidity, для работы с датчиком влажности и TemperaturePressure, для работы с датчиком давления и температуры.
Для работы с датчиком давления используется библиотека Wire, которая включена в стандартный набор библиотек Arduino. К сожалению я не понял, как можно задействовать в своей библиотеке стандартные библиотеки ардуино, так что пришлось в программе включать два заголовочных файла - Wire.h и Weather.h

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

Ну и наконец скетч для ардуино, который использует библиотеку Weather:

#include <wire.h>
#include <weather.h>

#define HUMIDITY_PIN 0

Humidity humidity(HUMIDITY_PIN);
TemperaturePressure tempPres;

void setup() {
  Serial.begin(9600);
  Serial.println("Calibrating...");
  tempPres.begin();
  Serial.println("Calibrated");

  // Light the LED when ready
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
}

void loop() {
  int h = humidity.get_humidity_int();

  tempPres.read_data_from_sensor();
  int t = tempPres.get_temperature();
  float p = tempPres.get_pressure() * 7.5006e-3; // convert to mmHg

  Serial.print(t/10.0);
  Serial.print(";");
  Serial.print(p);
  Serial.print(";");
  Serial.println(h);

  delay(60000);
}

Скетч получает данные о температуре, относительной влажности и давлении и передает их через последовательный порт на десктоп, где простой python-скрипт записывает их в CSV-файл. Из результирующих данных можно, к примеру, построить графики изменения параметров во времени.


Исходники библиотеки и скетча можно скачать отсюда или с помощью Mercurial забрать с bitbucket

30.10.10

Design patterns



Then there was another book that everybody thought was the greatest thing ever in that same period—Design Patterns—which I just thought was crap. It was just like, programming via cut and paste. Rather than thinking through your task you looked through the recipe book and found something that maybe, kinda, sorta felt like it, and then just aped it. That’s not programming; that’s a coloring book. But a lot of people seemed to love it. Then in meetings they’d be tossing around all this terminology they got out of that book. Like, the inverse, reverse, double-back-flip pattern—whatever. Oh, you mean a loop? OK. -- Jamie Zawinski from "Coders at Work". 


Just what I always felt about all this stuff with patterns, but could not express clearly.

13.04.10

Камень в огород Apple

Натолкнулся у Simon Wilson на следующую цитату:
Imagine if 10% of the apps on iPhone came from Flash. If that was the case, then ensuring Flash didn’t break release to release would be a big deal, much bigger than any other compatibility issues. [...] Letting any of these secondary runtimes develop a significant base of applications in the store risks putting Apple in a position where the company that controls that runtime can cause delays in Apple’s release schedule, or worse, demand specific engineering decisions from Apple, under the threat of withholding the information necessary to keep their runtime working.
Не могу понять почему яблофаны считают что сторонние поставщики ПО будут влиять на платформу Эппл. И еще большее недоумение вызывает тот факт, что такое влияние — это негативный фактор.

Платформа будет интересна пользователям, если для нее существуют приложения, этим пользователям нужные. Не зря Баллмер прыгал по сцене с воплями "Developers, developers". Microsoft понимает, что систему делают приложения, как короля — свита. И все равно на каком языке эти приложения написаны и какие фреймворки используют. И пользователям по большому счету все равно. Им будут нравиться удобные, быстрые и безглючные приложения и не нравится тормозные глюкавые уродцы.

Если при этом Эпплу придется расширять API, потому что какой-то функционал будет востребован разработчиками, это, в итоге, будет играть на руку пользователям платформы — они получат новые нужные им приложения. А это будет плюсом для самой Apple, ведь лояльность пользователей увеличится, и тот же человек понесет Джобсу свои деньги и за iPhone 4 и за iPad 2, 3 и т.п.

Будем наблюдать за противостоянием iPhone OS/Android — история расставит все по местам.

13.02.09



Обновил себе оптику. Профи конечно будут плеваццо от сигмы, ну а мне вместо старого кита вполне подходит.
18-50 F2.8 EX DC MACRO HSM

19.12.08

Кризис (_._)

05.11.08

:-P

09.09.08

Маркетинг

В маркетинге главное - правильное сравнение


29.07.08

Login: no shell: Permission denied

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

После небольшого анализа логов оказалось, что дело в SELinux. В /var/log/messages было полно записей вида "SELinux is preventing access to files with the label, file_t"

В старом ядре он был не то отключен, не то в permissive режиме, а в новом, по всей видимости, запускался в restricted режиме. А на файловой системе практически повсеместно отсутствовали необходимые метки. file_t - это контекст, который ядро дает файлам без меток.

Чтобы все починить надо загрузиться в однопользовательском режиме. Для этого при загрузке в меню grub надо выбрать нужное ядро и нажать a. К параметрам ядра надо добавить параметр single.

После загрузки надо выполнить следующие команды:
touch /.autorelabel; reboot
Это отправит компьютер перезагружаться, в процессе перезагрузки для всех файлов на файловой системе будут заново созданы метки для SELinux. Это может занять довольно много времени. Когда создание меток закончится, произойдет еще одна перезагрузка и вуаля. Все заработало.

10.06.08

Асусятинка

У меня появилась Асусятина


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