木曜日, 4月 28, 2016

Arduino: 温度湿度センサー DHT11

温度湿度センサー DHT11 が今日届きました。

中国からだといつ届くかわからないこの意外性が贈り物みたいでいいですね。

このセンサー精度がどうとかいう記述があって、迷っていたのですが結局買ってしまいました。

いいですね。きちんと動きます。Arduino のおかげです。書き込みが多くて世界中の人間が使っているのが分かります。

ピン配置は左から Vcc, Data, NC, GND です。5k ほどのプルアップ抵抗が必要です。

ライブラリをダウンロードして、読み込むときちんと表示されました。もちろん、配線を間違えると動きません。アナログ入力ピンなどとつなぐとだめです。


 読み込めてうれしいところでくだんの有機ELディスプレイとつないでみました。

このハードルの低さ。情報の多さ、完成度の高さ。Arduino ですね。

#include <dht.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
dht DHT;
#define DHT11_PIN 5
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
}
void loop() {
display.setCursor(0, 0);
int chk = DHT.read11(DHT11_PIN);
if (chk == DHTLIB_OK)
{
display.clearDisplay();
display.println("Humidity: " + String(DHT.humidity) + " %");
display.println("Temperature: " + String(DHT.temperature) + " C");
}
else
{
display.println("Hello DHT11");
}
display.display();
delay(2000);
}
view raw DHT11.ino hosted with ❤ by GitHub

ブレッドボードでは心もとないので、DHTモジュールをつくっておきました。あとはいつもの百均ケースで収まってくれました。

水曜日, 4月 27, 2016

PowerBuilder: 変数名と区切り

PowerBuilder ってのは癖の多い言語です。

しっかしですよね、コンパイラまで癖っていうか多い。

ちょっと頭きましたよ。かっときても仕様がないんですが

// THIS.X=PARENT.Width-THIS.Width-100
THIS.X = PARENT.Width - THIS.Width - 100

上のがダメなやつで、エラーを出してきます。

パーサーがなってないんですよ。

気をつけましょう。

木曜日, 4月 21, 2016

Arduino: ドットマトリクス・ディスプレイで遊ぶ


 ドットマトリクス・ディスプレイというものがあります。

ドット(点、それぞれLED)で構成されたディスプレイなわけですが、一行ずつ行のLEDを点灯すると、行ごとパターンが光ります。

これを繰り返していくとディスプレイ全体で図形が表示されるというのが一般的なドットマトリクス・ディスプレイの使い方です。

Arduino 単体でも 8x8 であれば動くわけですが、そのままだと行+列ぶんだけ信号線が要ります。この処理を引き受けてくれるICを使うとドットマトリクス・ディスプレイを楽しく使うことができます。



写真は MAX7219 を使ったキットです。よくできてます。作るときのワクワク感、できたときの満足感が保証できるのがキットのいいところといえるでしょう。出来上がりも見事です。明るく輝くLEDディスプレイで遊んでみました。

まずはキットから。MAX7219, セラミック、電解コンデンサ、抵抗とピンソケットをはんだ付けします。

そして、配線。

VCC    5V
GND    GND
DIN    8 ピン
CS    9 ピン
CLK    10ピン

こちら Arduino 用のスケッチです。ドットのパターンは Java アプリを書いて作成しました。

できた動画がこれです。今の気分を表してます (^^




このディスプレイを赤外線センサーPIRを使って手を振ると動作を開始するよう改良してみました。

リモートでも動くよう割り込みを調整してみました。

ブレッドボード Arduino で組めばそこかしこ置いて遊べます。

百均ケースでうまく収まってます。



#3Dプリンタで作るケースならしっかり収まります。STL ファイルはこちら(2017-12-23)





コードはこちらです。

#include <IRremote.h>
int pinCLK = 10;
int pinCS = 9;
int pinDIN = 8;
boolean displayOn = false;
int pir = 2;
int remote = 3;
IRrecv irrecv(remote);
decode_results results;
unsigned char dat[8] = {0b010000001,
0b001011010,
0b000100100,
0b001011010,
0b001011010,
0b000100100,
0b001011010,
0b010000001
};
unsigned char heart[8] = {0b00000000,
0b01100110,
0b11111111,
0b11111111,
0b11111111,
0b01111110,
0b00111100,
0b00011000
};
unsigned char smily[8] = {0b00000000,
0b01000010,
0b11100111,
0b01000010,
0b00000000,
0b01000010,
0b00100100,
0b00011000
};
unsigned char handsup[8] = {0b10000001,
0b01011010,
0b00100100,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00100100
};
unsigned char handshoriz[8] = {0b00000000,
0b00011000,
0b11100111,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00100100
};
unsigned char handsdown[8] = {0b00000000,
0b00011000,
0b00100100,
0b01011010,
0b10011001,
0b00011000,
0b00011000,
0b00100100
};
void WriteByte(unsigned char DATA)
{
unsigned char i;
digitalWrite(pinCS, LOW);
for (i = 8; i >= 1; i--)
{
digitalWrite(pinCLK, LOW);
digitalWrite(pinDIN, DATA & 0x80);
DATA = DATA << 1;
digitalWrite(pinCLK, HIGH);
}
}
void writeChar(unsigned char address, unsigned char dat)
{
digitalWrite(pinCS, LOW);
WriteByte(address);
WriteByte(dat);
digitalWrite(pinCS, HIGH);
}
void clearScreen()
{
for (int i = 1; i < 9; i++)
writeChar(i, 0);
}
void initDisplay(void)
{
writeChar(0x09, 0x00);
writeChar(0x0a, 0x03);
writeChar(0x0b, 0x07);
writeChar(0x0c, 0x01);
writeChar(0x0f, 0x00);
}
void setup()
{
pinMode(pir, INPUT_PULLUP);
pinMode(remote, INPUT_PULLUP);
pinMode(pinCLK, OUTPUT);
pinMode(pinCS, OUTPUT);
pinMode(pinDIN, OUTPUT);
delay(50);
initDisplay();
displayOn = true;
irrecv.enableIRIn();
attachInterrupt(digitalPinToInterrupt(pir), displayToggle, CHANGE);
attachInterrupt(digitalPinToInterrupt(remote), checkRemote, CHANGE);
}
void checkRemote()
{
if (irrecv.decode(&results)) {
displayOn = !displayOn;
irrecv.resume();
}
}
void displayToggle()
{
displayOn = !displayOn;
}
void loop()
{
if (displayOn)
{
for (int j = 0; j < 5; j++)
{
for (int i = 1; i < 9; i++)
writeChar(i, handsup[i - 1]);
delay(100);
for (int i = 1; i < 9; i++)
writeChar(i, handshoriz[i - 1]);
delay(100);
for (int i = 1; i < 9; i++)
writeChar(i, handsdown[i - 1]);
delay(100);
for (int i = 1; i < 9; i++)
writeChar(i, handshoriz[i - 1]);
delay(100);
}
for (int i = 1; i < 9; i++)
writeChar(i, smily[i - 1]);
delay(1000);
for (int i = 1; i < 9; i++)
writeChar(i, heart[i - 1]);
delay(1000);
displayOn = false;
clearScreen();
}
}

水曜日, 4月 13, 2016

PowerBuilder: タブページからタブそのものを切り替える

癖の多い PowerBuilder ですが、要は OOP ってことで、順序を踏めばきちんと動きます。

タブページのボタンからタブそのものを切り替えるなというときは、親タブのイベントを用います。

SelectTab() という関数は、タブ名をインデックスあるいは文字列で指定できます。

タブページは Control 配列で指定できます。

tab ltb_tab
u_onboarding_monitor luo_monitor

ltb_tab=PARENT.GetParent()
ltb_tab.DYNAMIC SelectTab('tabpage_onboarding_monitor') 

luo_monitor=ltb_tab.Control[ltb_tab.selectedtab]
luo_monitor.EVENT ue_Search()

月曜日, 4月 11, 2016

Arduino: 有機ELディスプレイを使う

今日、有機ELディスプレイが届きました。有機ELは英語で OLED ですね。有機ELは液晶ディスプレイよりまだ高価ですが、近い将来、市場を席巻するだろうという未来の素材です。


有機ELは発光素子を挟み込んだ画面を用います。発光素子を直接光らせるので、画面のバックライトをフィルターして見せている液晶より明るく、消費電力が少ないわけです。バックライトが必要ないため薄くできます。


薄くて明るく消費電力の少ないという有機ELですが、そろそろ手ごろな値段で出ています。さっそく注文してみました。この価格帯だと解像度というレベルのものではないですが、細かい文字も表示できます。


この小さなディスプレイは、端子はたったの4つ。



ライブラリなどは128x64サイズのものを使えばそのまま文字でもビットマップでも表示できます。

https://github.com/adafruit/Adafruit_SSD1306
https://github.com/adafruit/Adafruit-GFX-Library

このライブラリですが、使用の際ディスプレイのアドレスを得る必要があります。

http://playground.arduino.cc/Main/I2cScanner

アドレスを得たら初期化のとき引数として渡してやります。

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 

この画面サイズの場合、ヘッダファイル(Adafruit_SSD1306.h)を書き換える必要があります。

   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16


ライブラリを使っての HelloWorld! スクリプトです。

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
/*
for (uint8_t i=0; i < 168; i++) {
if (i == '\n') continue;
display.write(i);
if ((i > 0) && (i % 21 == 0))
display.println();
}
*/
/*
String str="Hello World!";
for(uint8_t j=0;j<5;j++)
{
display.setTextSize(j);
// for(uint8_t i=0;i<str.length();i++)
for(uint8_t i=0;i<1;i++)
{
// display.write(str.charAt(i));
display.write('A');
}
// display.println();
}
*/
String str="Hello World!";
display.setTextSize(1);
display.println(str);
display.display();
display.startscrollright(0x00, 0x0F);
delay(1000);
display.stopscroll();
delay(500);
display.startscrollleft(0x00, 0x0F);
delay(1000);
display.stopscroll();
delay(500);
display.startscrolldiagright(0x00, 0x0F);
delay(1000);
display.startscrolldiagleft(0x00, 0x07);
delay(1000);
display.startscrolldiagright(0x00, 0x0F);
delay(1100);
display.startscrolldiagleft(0x00, 0x07);
delay(850);
display.stopscroll();
}
void loop() {
}
view raw helloOLED.ino hosted with ❤ by GitHub


動きました!ので、使いやすいよう Arduino 用有機ELディスプレイ・モジュールを作ってみました。

ここで晒すのもなんですが、配線はこんな感じです。アナログ入力端子をふさがないよう長足のピンソケットをつけています。モジュールだと配線を考えなくていいので使いやすいです。


モジュールが使いやすいってのはつまり配線を間違えることがない、成功率が高い、能率がいい、ひいては使う際の敷居が低いってことでもあります。すべからくモジュールを組んでおくと Arduino の良さを満喫できます。

#使ってみると有機ELディスプレイってのはいいです。小さいし軽い。電池も持つしいうことないです。早くもっと普及してほしい。

#この「IICシールド」、他のIIC機器用のシールドとしても使えます。時計モジュールとつなぐとそのまま時刻が読めます。


Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...