2025年11月6日木曜日

DHT22-4pin,SB1602 on arduino uno r3

 https://zenn.dev/suzuky/articles/25dab74334e6ff でdht22成功

本文のdht11をdht22にした dht11,dht22ともに配線はおなじ

// Example testing sketch for various DHT humidity/temperature sensors

// Written by ladyada, public domain


#include "DHT.h"


#define DHTPIN 2     // what pin we're connected to


// Uncomment whatever type you're using!

//#define DHTTYPE DHT11   // DHT 11 

#define DHTTYPE DHT22   // DHT 22  (AM2302)

//#define DHTTYPE DHT21   // DHT 21 (AM2301)


// Initialize DHT sensor for normal 16mhz Arduino

DHT dht(DHTPIN, DHTTYPE);


void setup() {

  Serial.begin(9600); 

  Serial.println("DHTxx test!");

 

  dht.begin();

}


void loop() {

  // Wait a few seconds between measurements.

  delay(2000);


  // Reading temperature or humidity takes about 250 milliseconds!

  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

  float h = dht.readHumidity();

  // Read temperature as Celsius

  float t = dht.readTemperature();

  // Read temperature as Fahrenheit

  float f = dht.readTemperature(true);

  

  // Check if any reads failed and exit early (to try again).

  if (isnan(h) || isnan(t) || isnan(f)) {

    Serial.println("Failed to read from DHT sensor!");

    return;

  }


  // Compute heat index

  // Must send in temp in Fahrenheit!

  float hi = dht.computeHeatIndex(f, h);


  Serial.print("Humidity: "); 

  Serial.print(h);

  Serial.print(" %\t");

  Serial.print("Temperature: "); 

  Serial.print(t);

  Serial.print(" *C ");

  Serial.print(f);

  Serial.print(" *F\t");

  Serial.print("Heat index: ");

  Serial.print(hi);

  Serial.println(" *F");

}


https://morimori2008.web.fc2.com/contents/Arduino/i2cLCD_Arduino.html

を参考に成功 ライブラリファイルのsendをwriteにした(IDEよりの指示)

また写真ではRSTをつないでいたが、なくても動いた!

/*************************************************

 * [プログラム名]

 * ST7032コントローラ by Arduino

 * [プログラムの説明]

 * ストロベリーリナックスより購入できるLCDモジュールをI2Cで制御するプログラムです。

 * 

 * [参考資料]

 * [1]ArduinoでI2C液晶,http://blog.goo.ne.jp/sim00/e/ab138be751d447bcdb0eecaaca232214,2011/5.

 * [2]ストロベリーリナックス I2C低電圧キャラクタ液晶モジュール,http://strawberry-linux.com/catalog/items?code=27001,2011/5.

 * 

 * [LCDモジュール説明]

 * LDCモジュールは16文字×2行です。

 * 文字アドレスは、1行目が0x00-0x0f

 * 文字アドレスは、2行目が0x40-0x4f

 * 

 * [I/O port map]

 * Arduino     i2c-lcd

 * Dig 2 ----- 1pin rst (pull-up 10k ohm)

 * Ana 5 ----- 2pin scl (pull-up 2.2k ohm)

 * Ana 4 ----- 3pin sda (pull-up 2.2k ohm)

 * GND ------- 4pin

 * 5V -------- 5pin

 ***********************************************/

// ********** ヘッダファイルをインクルード **********

#include <Wire.h>


// ********** define宣言 **********

#define ASC_LF    0x0a  // ASCIIコードでLF(ラインフィード)

#define ASC_CR    0x0d  // 同じく、CR(キャリッジリターン)

#define LCD_LN    2     // LCDに表示可能な行数

#define resetPin  2

#define sdaPin    18    // analog pin 4

#define sclPin    19    // analog pin 5

#define i2c_adr   0x3e  // LCD表示器のアドレス(I2C上での識別ID番号です)

#define contrast  10    // 0-63 5V系だとかなり小さくする

// ********** 外部変数 **********

char line_num = 0;

byte lcd_head_addST47032[2] = {    // LCDの各行先頭アドレス

  0x00, 0x40};

// ********** サブルーチン群 **********

// LCDに関するサブルーチンはここから-----

/*  */

void lcd_cmd(byte x)

{

  Wire.beginTransmission(i2c_adr);

  Wire.write(0x00);

  Wire.write(x);

  Wire.endTransmission();

  return;

}

/*  */

void lcd_data(byte x)

{

  Wire.beginTransmission(i2c_adr);

  Wire.write(0x40);

  Wire.write(x);

  Wire.endTransmission();

  return;

}

/*--------------------------------- 

 文字の書き込みアドレス変更

 ---------------------------------*/

void lcd_move(byte pos){

  lcd_cmd(0x80 | pos);

  return;

}

/*--------------------------------- 

 LCDへ文字列を送信1

 文字列の終端のヌル文字を検出すると出力は止まる

 引数:*s 文字列の先頭アドレス(ポインタ)

 ---------------------------------*/

void lcd_print(char *s)

{

  while(*s) {

    if(*s != ASC_LF){

      lcd_data((byte)*s++);

    }

    else{

      s++;                                                  // 読み込み位置を進める

      lcd_move(lcd_head_addST47032[(++line_num) % LCD_LN]); // 改行コードを読み込むと、改行させる。上手い処理方法はないかな?

      line_num %= LCD_LN;

    }

  }

  return;

}

/*--------------------------------- 

 LCDへ文字列を送信2

 文字列の終端のヌル文字を検出すると出力は止まる

 表示位置を指定して出力することができます。

 引数:*s 文字列の先頭アドレス(ポインタ), line_num 行番号(0~), offset 左端からの文字数

 ---------------------------------*/

void lcd_print(char *s, int _line_num, int _offset)

{

  lcd_move(lcd_head_addST47032[_line_num % LCD_LN] + _offset);

  lcd_print(s);

  return;

}

/*--------------------------------- 

 LCDに数値を表示

 表示位置は前回の書き込みの後になります。

 引数:v 表示したい数値

 ---------------------------------*/

void lcd_print(int v)

{

  int i, j, k;


  i = 0;                            // 桁数を数える

  j = v;

  while(j){

    j /= 10;

    i++;

  }

  while(i--) {                      // 表示させる

    j = 1;

    for(k = 0; k < i; k++)j *= 10;  // 最上位の桁から取り出す

    k = (v / j) % 10;

    lcd_data((byte)(k + 0x30));    // ASCIIコードなので、0x30を足す

  }

  return;

}

/*--------------------------------- 

 LCDに数値を表示2

 表示位置は前回の書き込みの後になります。

 引数:v 表示したい数値,digit 表示したい桁数, c 埋めたい文字(例えば、'0')

 ---------------------------------*/

void lcd_print(int v, int digit, char c)

{

  int i, j, k, v_digit;


  i = 0;                            // 桁数を数える

  j = v;

  while(j){

    j /= 10;

    i++;

  }

  if(v == 0)i = 1;

  v_digit = i;                      // 渡された数値の桁数を覚えておく

  while(digit > 0) {                // 表示させる

    if(digit > v_digit){

      lcd_data((byte)c);            // 指定文字で埋める

    }

    else{

      i--;

      j = 1;

      for(k = 0; k < i; k++)j *= 10;  // 最上位の桁から取り出す

      k = (v / j) % 10;

      lcd_data((byte)(k + 0x30));    // ASCIIコードなので、0x30を足す

    }

    digit--;

  }

  return;

}

/*--------------------------------- 

 LCDに数値を表示3

 表示位置を指定して出力することができます。

 引数:v 表示したい数値, line_num 行番号(0~), offset 左端からの文字数

 ---------------------------------*/

void lcd_print(int v, int _line_num, int _offset)

{

  lcd_move(lcd_head_addST47032[_line_num % LCD_LN] + _offset);  // アドレスをセット

  lcd_print(v);                                                 // 数値を表示させる

  return;

}

/*--------------------------------- 

 LCDに数値を表示3

 表示位置を指定して出力することができます。

 引数:v 表示したい数値,digit表示したい桁数, c 埋めたい文字(例えば、'0'), line_num 行番号(0~), offset 左端からの文字数

 ---------------------------------*/

void lcd_print(int v, int digit, char c, int _line_num, int _offset)

{

  lcd_move(lcd_head_addST47032[_line_num % LCD_LN] + _offset);  // アドレスをセット

  lcd_print(v, digit, c);                                       // 数値を表示させる

  return;

}

/*--------------------------------- 

 LCDの初期化処理

 ---------------------------------*/

void lcd_init()

{

  // reset

  delay(500);

  digitalWrite(resetPin, LOW);

  delay(1);

  digitalWrite(resetPin, HIGH);

  delay(10);

  // LCD initialize

  delay(40);

  Wire.begin();

  lcd_cmd(0x38); // function set

  lcd_cmd(0x39); // function set

  lcd_cmd(0x14); // interval osc

  lcd_cmd(0x70 | (contrast & 15)); // contrast low

  lcd_cmd(0x5c | (contrast >> 4 & 3)); // contrast high / icon / power

  lcd_cmd(0x6c); // follower control

  delay(300);

  lcd_cmd(0x38); // function set

  lcd_cmd(0x0c); // display on

  lcd_cmd(0x01); // clear display

  delay(2);

}

// LCDに関するサブルーチンはここまで-----


// ********** undef宣言(他のソースコードに影響しないようにundefしておく) **********

#undef ASC_LF

#undef ASC_CR

#undef LCD_LN

#undef resetPin

#undef sdaPin

#undef sclPin

#undef i2c_adr

#undef contrast

0 件のコメント:

コメントを投稿