2024年2月27日火曜日

EEPROM-UNO/328p ー8mhzーでUARTsend成功/16mhzでrecv成功

 外付けの中華モジュールはI2C EEPROMモジュールを使う (7ujm.net)が完全にうごいた

EEPROM (ht-deko.com) UNO/Nanoの内臓EEPROMで通用するコード群

--------------------------uart----------------------

AVR Atmega328P UART (rjhcoding.com)

GitHub - xanthium-enterprises/atmega328p-serial-uart-to-pc-communication: Atmega328p sample codes for USART (transmission and reception) communication with a Linux/Windows PC

ーーーーーー送信ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

atmega328p-serial-uart-to-pc-communication/_1_Serial_Transmit/main.c at master · xanthium-enterprises/atmega328p-serial-uart-to-pc-communication · GitHub 

を改変して以下のコードでteratermしたら成功した

#include <stdint.h>

#include <avr/io.h>

#include <util/delay.h>

#define F_CPU 8000000UL

// +-----------------------------------------------------------------------+ //

// | ATmega328p Baudrate は以下のサイトを参考に51とした

//  https://qiita.com/k_match/items/c99d25adf6b1a984061f

//---------------------------------------------------------------------+ //

#define BAUD_RATE_9600_BPS  51 // 9600bps

// +-----------------------------------------------------------------------+ //

int main()

{

  int i = 0;

  unsigned int ubrr = BAUD_RATE_9600_BPS;

  unsigned char data[] = "Hello from ATmega328p  ";

  /* Set Baudrate  */

  UBRR0H = (ubrr>>8); 

// Shift the 16bit value ubrr 8 times to the right and

// transfer the upper 8 bits to UBBR0H register.

  UBRR0L = (ubrr);   

// Copy the 16 bit value ubrr to the 8 bit UBBR0L register,

// Upper 8 bits are truncated while lower 8 bits are copied

  UCSR0C = 0x06;       /* Set frame format: 8data, 1stop bit  */

  UCSR0B = (1<<TXEN0); /* Enable  transmitter                 */

  while(1) /* Loop the messsage continously */

  {

      i = 0;

      while(data[i] != 0) /* print the String  "Hello from ATmega328p" */

      {

         while (!( UCSR0A & (1<<UDRE0))); /* Wait for empty transmit buffer       */

      /* When UDRE0 = 0,data transmisson ongoing.                         */

      /* So NOT{[UCSR0A & (1<<UDRE0)] = 0} = 1 ,While(1) loop stays there */ 

      /* When UDRE0 = 1,data transmisson completed.                       */

      /* So NOT{[UCSR0A & (1<<UDRE0)] = 1} = 0 ,While(0) loop fails       */

      UDR0 = data[i];          /* Put data into buffer, sends the data */

      i++;                             /* increment counter                    */

      }

    

    /* Sending '\n'  '\r' Character pair helps to format the output properly on console putty Screen */

    /* Send "\n" Character */

    while (!( UCSR0A & (1<<UDRE0)));   /* Wait for empty transmit buffer       */

    UDR0 = '\n';              /* Put data into buffer, sends the data */    

    /* Send "\r" Character */

    while (!( UCSR0A & (1<<UDRE0)));   /* Wait for empty transmit buffer       */

    UDR0 = '\r';              /* Put data into buffer, sends the data */

    _delay_ms(100);

  }

  ーーーー受信ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これはArduinoのシリアルモニタからAを入力して成功!

// AVR Serial Reception @ 230.4k bps

// AVR Receives character 'A' Blinks the LED  on PC4

//                        'B' Beeps  the Buzzer on PC5

// External Oscillator = 11.0592MHz

// Controller ATmega328p



//+------------------------------------------------------------------------------------------------+

//| Compiler           : AVR GCC (WinAVR)                                                          |

//| Microcontroller    : ATmega328p                                                                |

//| Programmer         : Rahul.Sreedharan                                                          |

//| Date               : 16-July-2019                                                              |

//+------------------------------------------------------------------------------------------------+


//(C) www.xanthium.in 

// Visit to Learn More 



#include <stdint.h>

#include <avr/io.h>

#include <util/delay.h>


// +-----------------------------------------------------------------------+ //

// | ATmega328p Baudrate values for UBRRn for external crystal 11.0592MHz  | //

// +-----------------------------------------------------------------------+ //


#define BAUD_RATE_4800_BPS  143 // 4800bps

//#define BAUD_RATE_9600_BPS  71  // 9600bps

#define BAUD_RATE_9600_BPS 103 // 9600bps for 16mhz

// http://rjhcoding.com/avrc-uart.php

#define BAUD_RATE_14400_BPS  47 // 14.4k bps

#define BAUD_RATE_19200_BPS  35 // 19.2k bps  

#define BAUD_RATE_28800_BPS  23 // 28.8k bps

#define BAUD_RATE_38400_BPS  17 // 38.4k bps

#define BAUD_RATE_57600_BPS  11 // 57.6k bps

#define BAUD_RATE_76800_BPS   8 // 76.8k bps


#define BAUD_RATE_115200_BPS  5 // 115.2k bps

#define BAUD_RATE_230400_BPS  2 // 230.4k bps


// +-----------------------------------------------------------------------+ //



int main()

{

unsigned int ubrr = BAUD_RATE_9600_BPS; 


//PORTC = 0x00; //All LED's OFF

PORTD = 0x00;

/* Set Baudrate @ 230.4k bps */

UBRR0H = (ubrr>>8);

UBRR0L = (ubrr);

/*Enable receiver  */

UCSR0B = (1<<RXEN0);/* Set frame format: 8data, 1stop bit */

//pinMode(PD4,OUTPUT);

//digitalWrite(PD4,HIGH);

  _delay_ms(500);

 // digitalWrite(PD4,LOW);

while(1)

{

while ( !(UCSR0A & (1<<RXC0)) ); /* Wait for data to be received */

switch(UDR0) // using the switch() statement to  control the LED and Buzzer

{

case 'A' : DDRD  |= (1<<PD4); // Blinks LED

PORTD |= (1<<PD4);

_delay_ms(500);

PORTD &= ~(1<<PD4);

break;

            case 'B' : DDRD  |= (1<<PD5); // Beeps Buzzer

PORTD |= (1<<PD5);

_delay_ms(500);

PORTD &= ~(1<<PD5);

break;

default  :

break;

}//end of Switch()

}//end of While(1)

}//end of main


2024年2月26日月曜日

atmega328pを8mhzでブートローダ書いてからコード内で1mhzにして成功!

; timer0-1.asm

.include "m328pdef.inc"

.def STACK = R16

.def R_TEMP1 = R17

.def R_TEMP2 = R18

.EQU P_LED = PORTB ; LED

.EQU B_LED = 0 ; LED


.CSEG

RJMP MAIN

.ORG 0x0020 ; 0010 for mega48series

RJMP IOVF0


IOVF0:

IN STACK,SREG

LDI R_TEMP1,0x00

OUT TCCR0B,R_TEMP1

SBI PINB, B_LED

LDI R_TEMP1,0x9E ; 100mS

OUT TCNT0,R_TEMP1


LDI R_TEMP1,0x05

OUT TCCR0B,R_TEMP1


OUT SREG,STACK


RETI


MAIN:


CLI

LDI R16,0b10000000 ; 以下4行で8mhzが1mhzになる

STS CLKPR,R16

LDI R16,0b00000011

STS CLKPR,R16 

  

LDI R_TEMP1,0b11111111

LDI R_TEMP2,0b00000000

OUT DDRB,R_TEMP1

OUT PORTB,R_TEMP2


LDI R_TEMP1,0b11111111

LDI R_TEMP2,0b00000000

OUT DDRC,R_TEMP1

OUT PORTC,R_TEMP2


LDI R_TEMP1,0b11111111

LDI R_TEMP2,0b00000000

OUT DDRD,R_TEMP1

OUT PORTD,R_TEMP2


LDI R_TEMP1,0x05 ; prescale 1024

OUT TCCR0B,R_TEMP1


LDI R_TEMP1,0x9E ; 100mS

OUT TCNT0,R_TEMP1

LDS R_TEMP1,TIMSK0

SBR R_TEMP1,(1<<TOIE0)

STS TIMSK0,R_TEMP1

SEI 


MAIN01:

RJMP MAIN01


注:こんばんは。


> Subject: atmega8にはclkprがないようで
ヒューズ下位バイトの 3:0 を0001とすると内部1MHzになります。8MHzは0100です。

> 添付のファイルですが、attiny88用のtimer0-1.asmをatmega8に無理くり変更してみたのですが
> //の部分がうごきません よって8分周できんので8mhzでも12ms程度となりLチカできません
CLKPRレジスタがないのでヒューズを変更してください。

> //の部分がうごきません
CLR     R16            ; 1
SBR R16,(1<<CLKPCE)           ; 2
STS CLKPR,R16                      ; 3
*                                                ; 4
SBR R16,(1<<CLKPS1)+(1<<CLKPS0))   ; 5
STS CLKPR,R16                                        ; 6   
このコードはATmega88、328Pでも正常に動きません。本当に悩みました。
1でR16は0です。3でR16は0b10000000です。6でR16は0b10000011になり正常に動作しません。
*  ; 4 のところに CLR R16 を入れると4でR16は0b00000000になり、6でR16は0b00000011となり正常に動作します。

LDI R16, 0b10000000
STS  CLKPR, R16     ; P338 設定変更手順 ①
LDI   R16, 0b00000011
STS  CLKPR, R16                  ; P338 設定変更手順 ②
とすれば簡単です。
Cなら、
CLKPR=0b10000000;   // P338 設定変更手順 ①
CLKPR=0b00000011;           // P338 設定変更手順 ②
でOKです。なお①と②は4クロック以内にしないとCLKPCEビットが「0」になります。
よろしくお願いします。


attiny2313 deep zone/attiny85/attiny13-int-pcint

AVRでのタイマとPWMの使い方 | うしこlog (nomaki.jp) これはatmega328pだが

総論的で有益、ほかの内容も実例豊富

ATtiny2313 PWM - Pulse Width Modulation (startingelectronics.org) :: pwm success

ここでうしこlogにあるCOMB01のビット立てがないがPB2出力には無関係なのでOK

 LED点灯 (IO入出力 ) | 始めるAVR (startelc.com) が成功

#include <avr/io.h> int main() { // 初期化 //ポート入出力設定 DDRD = 0xF3; // ポートDを1111 0011 #2,3だけ入力設定 PORTD = 0x0C; // 0000 1100 #2,3だけ内部プルアップ設定 // 出力 PORTD |= 0x10; // 0001 0000 #4だけ出力 led#4点灯 while(1){ if( bit_is_clear (PIND,PD2) )

{ // ポートD#2 ==0 なら

PORTD |= _BV(PD5); //#2SW押しで Led#5点灯 PD5ピンを High }else{ PORTD &= ~_BV(PD5);

//#2SW押さないと Led#5消灯 PD5ピンを andLow } } }

タイマーで正確な時間稼ぎ(タイマー0) | 始めるAVR (startelc.com) これも成功

#include <avr/io.h>

void T0wait(unsigned char ms){ //ms回オーバーフローを繰り返すウエイト unsigned char i; for( i=0; i< ms; i++ ){ //オーバーフロー回数 while( bit_is_clear(TIFR,TOV0) ); //オーバーフローになるまで待つ TIFR = _BV(TOV0); // 検知フラグを戻して再開 } } int main(){ DDRD = 0xFF; // ポートDを全部出力設定 TCCR0B = 0x05; // プリスケーラは ck/1024 TCNT0 = 0; // タイマ0の初期値 while (1) { PORTD=0x10; //PORTD出力 LED#4点灯 #5消灯 0001 0000 T0wait(25); // (1/8M)×1024×256 ×24 ほぼ0.8sec PORTD=0x20; //PORTD出力 LED#4消灯 #5点灯 0010 0000 T0wait(25); } } // cpu clock is 8mhz at this case

ATtiny85 ADC tutorial with interrupts - Gadgetronicx 2examles success

ATtiny13の外部割込みメモ | くろべこblog (kurobekoblog.com) 2examples success

(also attiny85 can run this codes)

2024年2月25日日曜日

attiny13でINT0とGNDの間にスイッチ接続、PB0にLED接続で外部割込み

 ATtiny13の外部割込みメモ | くろべこblog (kurobekoblog.com)

// https://kurobekoblog.com/attiny_gaibuwarikomi#google_vignette
#include <avr/interrupt.h>
volatile byte state=0;
int16_t cnt;
 
ISR(INT0_vect){
  state=1;
}
// case1 and case2 で連携してチャタリング対策している!
void sw_up(){//スイッチ状態変化関数
  switch(state){
      case 0:
      break;
      case 1:
        cnt=1000;
        state=2;
      break;
      case 2:
        cnt--;
        if(cnt==0){
          PORTB ^= 0b00000001;
          state=0;
        }
  }
}

void setup(){
  DDRB   |= 0b00000001;//PB0出力
  PORTB  |= 0b00000010;//PB1プルアップ
  MCUCR  &= ~0b00000011;// LOWレベル検知
  GIMSK  |= (1<<6);//INT0割り込み許可    
  sei(); // 割り込み許可
}

void loop() {
  sw_up();
}

2024年2月16日金曜日

nrf24l01 on Attiny84 transmitter and ArduinoUno receiver

 【電子工作/Arduino】ATtiny84で動かすミニ無線コントローラー『TinyPad』を作ってみました! | ぶらり@web走り書き (burariweb.info)  このとおりにせんとうごかん!つまりmiso,mosiを逆に配線するのが肝でした! 実感したのは、トランスミッタはいいけどレシーバにはつかいづらい! 電波が届いているか否かをシリアルデバッグ困難にて

----- transmitter by attiny84- receiver by arduino uno -----

// transmitter
// for attiny84
#include <SPI.h>                  // ライブラリのインクルード
#include <nRF24L01.h>
#include <RF24.h>
 
RF24 radio(PA0, PA1);                // CE,CSNピンの指定      
const byte address[6] = "00001";  // データを送信するアドレス
 
int SW_PIN = 8; // pb2 is 8, pa7,pa2,pa3 ok
bool SW_state = 1;
int SW1_PIN = PA7; // pb2 is 8, pa7,pa2,pa3 ok
bool SW1_state = 1;
int Data[2];

void setup() { 
  pinMode(SW_PIN, INPUT_PULLUP);  // スイッチをプルアップで使用
  pinMode(SW1_PIN, INPUT_PULLUP);  // スイッチをプルアップで使用
  radio.begin();                  // 無線オブジェクトの初期化
  radio.openWritingPipe(address); // データ送信先のアドレスを指定
  radio.setPALevel(RF24_PA_MIN);  // 出力を最小に
  radio.stopListening();          // 送信側として設定
}

void loop(){
  SW_state = digitalRead(SW_PIN);            // スイッチの状態を読み取る
  if(SW_state==LOW)
  {
    Data[0]=100;
  }
  else if(SW_state==HIGH){
    Data[0]=10;
  }
  SW1_state = digitalRead(SW1_PIN);            // スイッチの状態を読み取る
  if(SW1_state==LOW)
  {
    Data[1]=100;
  }
  else if(SW1_state==HIGH){
    Data[1]=10;
  }
  radio.write(&Data, sizeof(Data));  // スイッチの状態配列を送信する
  delay(10);
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
// receiver
// for uno
#include <SPI.h>                  // ライブラリのインクルード
#include <nRF24L01.h>
#include <RF24.h>
 
RF24 radio(7, 8);                // CE,CSNピンの指定
const byte address[6] = "00001";  // データを受信するアドレス
int LED_PIN = 2;
int LED1_PIN = 3;
int Data[2];

void setup() {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN,HIGH);
  delay(500);
  digitalWrite(LED_PIN,LOW);
  pinMode(LED1_PIN, OUTPUT);
  digitalWrite(LED1_PIN,HIGH);
  delay(500);
  digitalWrite(LED1_PIN,LOW);
  radio.begin();                      // 無線オブジェクトの初期化
  radio.openReadingPipe(0, address);  // データ受信アドレスを指定
  radio.setPALevel(RF24_PA_MIN);      // 出力を最小に
  radio.startListening();             // 受信側として設定
  Serial.begin(9600);
}
 
 
void loop(){
 
  if (radio.available()){
    radio.read(&Data, sizeof(Data));  // スイッチの状態を受信して表示する
    Serial.print(Data[0]);
    Serial.print(" ");
    Serial.println(Data[1]);
    if(Data[0] == 10){
      digitalWrite(LED_PIN, LOW);
    } else if(Data[0]==100) {
      digitalWrite(LED_PIN, HIGH);
    }
    if(Data[1] == 10){
      digitalWrite(LED1_PIN, LOW);
    } else if(Data[1]==100) {
      digitalWrite(LED1_PIN, HIGH);      
    }
  }
 
 delay(10);
}

2024年2月12日月曜日

attiny13aでPB2につけた可変抵抗をadcしてPB1につけたLEDをPWMする 

 // https://adnbr.co.uk/articles/adc-and-pwm-basics

/* ---------------------------------------------------------------------
 * PWM LED Brightness control for ATtiny13.
 * Datasheet for ATtiny13: http://www.atmel.com/images/doc2535.pdf
 *
 * Pin configuration -
 * PB1/OC0B: LED output (Pin 6)
 * PB2/ADC1: Potentiometer input (Pin 7)
 *
 * ~100 bytes.
 *
 * Find out more: http://bit.ly/1eBhqHc
 * -------------------------------------------------------------------*/
// 9.6 MHz, built in resonator
#define F_CPU 9600000
#define LED PB1
#include <avr/io.h>
 
void adc_setup (void)
{
    // Set the ADC input to PB2/ADC1
    // admux https://garretlab.web.fc2.com/arduino/inside/hardware/arduino/avr/cores/arduino/wiring_analog.c/analogRead.html
    ADMUX |= (1 << MUX0); // analog pin select // ADC1 i.e. PB2
    ADMUX |= (1 << ADLAR); // 左詰めで結果をいれる?
 
    // Set the prescaler to clock/128 & enable ADC
    // At 9.6 MHz this is 75 kHz.
    // See ATtiny13 datasheet, Table 14.4.
    // ADEN::ADC-OK, ADPS1 AND ADPS0 TO 1/8 ? (1<<ADPS2) | が抜けている?
    ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
}
 
int adc_read (void)
{
    // https://awawa.hariko.com/chira-ura/atmega168-chapter23-jp.html
    // Start the conversion
    ADCSRA |= (1 << ADSC); // ADC START CONVERSION
    // Wait for it to finish
    while (ADCSRA & (1 << ADSC));  // 読み取りおわったらADCSRAはゼロとなる?
    return ADCH; // 上位8ビットのみ返す
}
 
void pwm_setup (void)
{ // https://usicolog.nomaki.jp/engineering/avr/avrPWM.html
    // Set Timer 0 prescaler to clock/8.
    // At 9.6 MHz this is 1.2 MHz.
    // See ATtiny13 datasheet, Table 11.9.
    TCCR0B |= (1 << CS01); // prescale 1/8
    // Set to 'Fast PWM' mode
    TCCR0A |= (1 << WGM01) | (1 << WGM00);
    // Clear OC0B output on compare match, upwards counting.
    TCCR0A |= (1 << COM0B1);
}
 
void pwm_write (int val)
{
    OCR0B = val;
}
 
int main (void)
{
    int adc_in;
 
    // LED is an output.
    DDRB |= (1 << LED);  
 
    adc_setup();
    pwm_setup();
 
    while (1) {
        // Get the ADC value
        adc_in = adc_read();
        // Now write it to the PWM counter
        pwm_write(adc_in);
    }
}

2024年2月10日土曜日

echo-server template (via ncat client)

 // https://e-penguiner.com/socket-programming-c-cpp/// オリジナルのsingle request power down pattern を改変してループとした

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

int main(int argc, char const *argv[])
{
    const int port_number = 12345;
    // create server socket
    int sockfd = 0;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
    // setup server socket
    struct sockaddr_in server;
    int addrlen            = sizeof(server);
    server.sin_family      = AF_INET;
    server.sin_addr.s_addr = inet_addr("192.168.3.14");
    server.sin_port        = htons(port_number);
    int opt                = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)))
    {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        perror("Bind error");
        exit(EXIT_FAILURE);
    } // これでsockfdがサーバとなる
    // start to listen requests
    if (listen(sockfd, SOMAXCONN) < 0)
    {
        perror("Listen error");
        exit(EXIT_FAILURE);
    }
    // accept request from client
    struct sockaddr_in client;
    int client_len = sizeof(client);
    int sock       = 0;
    if ((sock = accept(sockfd, (struct sockaddr *)&client, (socklen_t *)&client_len)) < 0)
    {
        perror("Error: accept");
        exit(EXIT_FAILURE);
    } // listenしていてacceptしたら上記sockはクライアントをさす
    // read data from client
    char buff[1024] = {0};
    while(1){
     recv(sock, buff, sizeof(buff), 0);
     printf("received message is \"%s\"\n", buff);
     
     if (strncmp(buff,"on",2)==0) { printf("\nhi!light on!\n");}
     // この関数で成功した!
     
     // send data to client
     char *hello = "Hello from server\n";
     send(sock, hello, strlen(hello), 0);
     printf("Message sent to client\n");
    }
    // close connecting socket
    close(sock);
    // close listening socket
    shutdown(sockfd, SHUT_RDWR);
    close(sockfd);
    return 0;
}

2024年2月3日土曜日

avr deep zone(attiny13a/10,85,84/44,mega8/168/328)

 ATTiny13Aのプログラム: アマチュア無銭家のブログ (cocolog-nifty.com) 

あきらかにPB5までプルアップするのは不要だった 理由不明

チャタリング対策はされていない PB1入力はINT0のため

[電子工作]Attiny13AのPCINTで外部ピン変化割り込み | fenrir's memorandum (karlsnautr.blogspot.com)  PCINT利用 プルアップは抵抗で チャタリングはコンデンサ

----------------------------------------------------------------------------

ATtiny85 PWM Primer Tutorial Using Arduino (electroschematics.com) default OK

--------------------------------------------------------------------------------

attiny84/44はattiny2313より進化して4ピンがちゃんとPWMできた

ただしPB2は8とせんとあかんかった (BrariWebなど参考に)

ちなみにliquidcrystalI2c,dht11(PA5)でばっちりうごく

Arduinoでラリコン作る話(2)→ATtiny44でラリコン作る話(2) - なにかと気球人🎈JS2OIA BLOG (hatenablog.com)

---------------------------------------------------------------------------

mega8はpwm3個、mega168/328は6個 ちなみにattiny2313は4個だが癖がある!

attiny13,attiny10はしらんけど多分1個だろう

2024年2月1日木曜日

raspberry pi uart.py and c (tone,dht11,bme280,hc-sr04)

---- receive.py via hc05 ----------------------------------------

import serial

import time


SerDevice = serial.Serial('/dev/serial0', 9600, timeout=10)



#******************************

#Recieve Response

while True:

    #Read data one Line (top->'\r\n')

    L_RecieveData=SerDevice.readline()

    RecieveData = L_RecieveData.decode()


    #Get Data Length

    DataLength = len(L_RecieveData)

    print(DataLength) #cr/lfのみのとき2となる

    #If DataLength = 2, then Response END!!

    if DataLength==2: 

        break

    else:

        print(RecieveData)


#******************************

#Close Serial Device

SerDevice.close()


-------- send.py  via hc05  ------

import serial

import time

i=0

ser = serial.Serial('/dev/serial0', 9600)

while(i != 10):

    ser.write(b'10\n')

    time.sleep(1)

    i = i+1

ser.close()



ーーーwiringPi.setup.gpioーーー音出しーーー

https://torisky.com/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%EF%BC%9Ac%E8%A8%80%E8%AA%9E%E3%81%A7gpio%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%A7%E3%81%8D%E3%82%8Bwiringpi%E3%81%AE%E3%82%A4%E3%83%B3/

ーーーーdht11ーーーーーーーーーーーーーーーーー

https://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-the-raspberry-p に以下も参考にしてsetupをsetupGpioにした!

https://sky-dream.xyz/2020/10/18/%E6%B8%A9%E6%B9%BF%E5%BA%A6%E3%82%92%E8%A8%88%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%80%80%EF%BD%9Edht11%E7%B7%A8%E3%80%80%EF%BD%82%EF%BD%99c%EF%BD%9E/


#include <wiringPi.h>

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

#define MAXTIMINGS 85

#define DHTPIN 4   // as gpio number

int dht11_dat[5] = { 0, 0, 0, 0, 0 };

void read_dht11_dat()

{

uint8_t laststate = HIGH;

uint8_t counter = 0;

uint8_t j = 0, i;

float f; 

 

dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;

  pinMode( DHTPIN, OUTPUT );

digitalWrite( DHTPIN, LOW );

delay( 18 );

digitalWrite( DHTPIN, HIGH );

delayMicroseconds( 40 );

pinMode( DHTPIN, INPUT );

 

for ( i = 0; i < MAXTIMINGS; i++ )

{

counter = 0;

while ( digitalRead( DHTPIN ) == laststate )

{

counter++;

delayMicroseconds( 1 );

if ( counter == 255 )

{

break;

}

}

laststate = digitalRead( DHTPIN );

 

if ( counter == 255 )

break;

 

if ( (i >= 4) && (i % 2 == 0) )

{

dht11_dat[j / 8] <<= 1;

if ( counter > 16 )

dht11_dat[j / 8] |= 1;

j++;

}

}

 

if ( (j >= 40) &&

     (dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) )

{

f = dht11_dat[2] * 9. / 5. + 32;

printf( "Humidity = %d.%d %% Temperature = %d.%d C (%.1f F)\n",

dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f );

}else  {

printf( "Data not good, skip\n" );

}

}

 

int main( void )

{

printf( "Raspberry Pi wiringPi DHT11 Temperature test program\n" );

if ( wiringPiSetupGpio() == -1 )  // setupではgpioつかえない!

exit( 1 );

while ( 1 )

{

read_dht11_dat();

delay( 2000 ); 

}

  return(0);

}


ーーーーー超音波ーーーー

超音波距離センサー HC-SR04 - GreenLeaf (mydns.jp) 記述通り1kΩはなくても動いた

--------------BME280------------------------

https://tomosoft.jp/design/?p=6963 もあるが

温湿・気圧センサモジュール AE-BME280 - GreenLeaf (mydns.jp) OKだった