2026年1月15日木曜日

毒書案内:読んではいけない15/35冊、中国近現代文学、演劇・戯曲

  1.  ーーー戯曲ーーー 
  2. ◯ピランデッロ 「作者をさがす6人の人物」
  3. ◯モリエール タルチュフ 読書中
  4. ◯三島由紀夫 近代能楽集 読書中
  5. ーーーー荒唐無稽ーー
  6. 〇神聖喜劇
  7. @沼正三『家畜人ヤプー』マゾヒストの奇想が構築した倒錯のユートピア 有料電子あり 完結版で再読(挿絵がいいと)だが其の後の加筆で幻冬舎全五巻電子版(挿絵なし)に落ち着いたようだが紙版は前者のみにて、紙版手元ありで読む この前に正篇あり既読 完結編 @石ノ森の漫画(全四巻)
  8. ーーー15冊ーーーー
  9. われらの時代』・・・大江健三郎  kindleで読む
  10. ブレストの乱暴者』 代替『花のノートルダム』紙版で読む・・・ジャン・ジュネ 
  11. 北回帰線』・・・ヘンリー・ミラー  図書館本、紙版で読む
  12. 悪徳の栄え』・・・マルキ・ド・サド kindleで読む
  13. ボードレール2冊紙版で代替 マルドロールの歌 ロートレアモン全集』・・・  
  14. ◯『夜の果てへの旅』・・・ルイ=フェルディナン・セリーヌ
  15. 〇『』・・・谷崎潤一郎 「瘋癲老人日記」で代替Koboで読む
  16. ○『地下室の手記』・・・ドストエフスキー
  17. ○『死霊』・・・埴谷雄高 第一巻で満腹
  18. 〇『ツァラトゥストラ』・・・フリードリッヒ・ニーチェ
  19. 〇『眼球譚(初稿)』・・・ジョルジュ・バタイユ
  20. 〇『サンクチュアリ』・・・ウィリアム・フォークナー
  21. 〇『地獄の季節』・・・ランボオ
  22. 〇『二十歳のエチュード』・・・原口統三 kindleで読む
  23. 〇『トニオ・クレーゲル』・・・トーマス・マン 「ヴェニスに死す」で代替する
  24. 以上が15冊:https://bookdiary.livedoor.biz/archives/50333436.html 
  25. 以下は https://nichijyo.mydns.jp/2009/06/no875.html にある
  26. 毒書案内: 人生を狂わせる読んではいけない本
  27. として別本で35冊リストアップされている
  28. ーーーー35冊ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  29. 太宰治『人間失格』人間として生きられない人間の悲惨な生涯
  30. 〇ヨーハン・ヴォルフガング・ゲーテ『若きウェルテルの悩み』善女の顔をした悪女に殉ずる青年の悲劇
  31. 〇安部公房『砂の女』 砂の世界に囚われた失踪者の新しい日常
  32. 〇フランツ・カフカ『審判』自分の知らない罪によって裁かれる恐怖
  33. 〇埴谷雄高『死霊』嗜好の実験室で培養された観念小説の極北 第一巻で満腹
  34. 〇夢野久作『ドグラ・マグラ』読者の現実感覚を崩壊させる記憶の迷宮 世界観を知る意味で代替『瓶詰地獄』を読んだ
  35. 〇アルチュール・ランボー『地獄の季節』 鮮烈なイメージが炸裂する天才の散文詩
  36. 〇フリードリッヒ・ニーチェ『ツァラストゥストラ』 読者の魂を焼き尽くす神なき世界の黙示録
  37. 〇三島由紀夫『金閣寺』 美を滅ぼすことに憑かれた青年僧の告白
  38. 〇大岡昇平『野火』 戦争という狂気が生み出す人肉食の悪夢
  39. 〇ウィリアム・フォークナー『サンクチュアリ』 「聖域」で繰り広げられる変質者の陰惨な暴力
  40. 〇中上健次『千年の愉楽』 「路地」に生まれた若者たちの沸騰する生と死
  41. 〇川端康成『眠れる美女』死臭漂う宿で老人たちが営む性の秘儀
  42. 〇ウラジミール・ナボコフ『ロリータ』中年男を「萌え」させるニンフェットの魔力
  43. 〇江戸川乱歩『芋虫』人間が人間であることの極限に触れた短篇
  44. 〇ジョルジュ・バタイユ『眼球譚(がんきゅうたん)』読者に嫌悪と嘔吐を催させる究極の背徳
  45. 〇フョードル・ドストエフスキー『地下室の手記』 自意識の病を分析する「ニート」の独白
  46. トーマス・マン『ヴェニスに死す』少年の妖しい美に魅せられた中年作家の死
  47. ◯ルイス・キャロル『不思議の国のアリス』 少女というトリックスターの異界めぐり 
  48. ○ジャン=ジャック・ルソー『孤独な散歩者の夢想』生と死の境界線を消滅させる甘美な思索の書というが個人的には勝手に震えてろの世界
  49. 島尾敏雄『死の棘(とげ)』 夫婦の愛憎の極限を描く凄惨な私小説だった
  50. ◯梯久美子『狂うひと 「死の棘」の妻・島尾ミホ 』 妻の立場からのノンフィクション島尾ミホ「祭りの裏」は名作の予感
  51. ◯セリーヌ 夜の果てへの旅 戦場から暗黒大陸へ、工業社会の底に温みを見出しつつ拒み故郷の貧民窟へ落ち、知性に出来する語彙を下卑さも尽くし呪詛。ドブ泥に自ら沈む者の特権
  52. ◯ライナー・マリア・リルケ『マルテの手記』  cf 堀辰雄の要約は青空で読んだ パリを彷徨する孤独な青年の心象風景
  53. 〇谷崎潤一郎『鍵・瘋癲(ふうてん)老人日記』 観念の世界で欲望を駆り立てる男たちの痴態
  54. ◯河野多恵子『少年狩り』 弟子の山田詠美「血も涙もある」で代替
  55. 〇永山則夫『無知の涙』 獄中で自我に目覚めた連続射殺魔の手記 代替:自伝的小説「木橋」で生い立ちはわかったが。。。
  56. @原口統三『二十歳のエチュード』少年少女の夭折(ようせつ)願望を刺激する若き魂の記録 kindleで読書中
  57. 上記関連 @田舎司祭の日記(映画も見よう)、
  58. @アドルフ・ヒトラー『わが闘争』 世界を破滅へと導いた反ユダヤ思想のバイブル300頁 続も含める立場もあるが、上下の2巻がkindleにあるので購入した
  59. @マルキ・ド・サド『悪徳の栄え(澁澤龍彦訳)』残虐行為の快楽を称揚する悪の哲学     kindleで購入した
  60. @大江健三郎『われらの時代』 疾走する文体で読者を揺さぶる挑発的 kindleで購入した
  61. @阿部昭「司令の休日」をkindleで購入した 内向の世代
  62. 関連文書   〇阿川「年々歳歳」、  〇吉行「驟雨」 
  63. 第三の新人  〇庄野「プールサイド小景」、 〇安岡章太郎『海辺の小景』 
  64. @ロートレアモン『マルドロールの歌』 野生の言語が繰り広げる荒唐無稽な幻想文学 ボードレール「悪の華・他」で代替
  65. @ジャン・ジュネ『ブレストの乱暴者』『泥棒日記』『花のノートルダム』の3作が代表作 代替として処女作の『花の。。。』を古典新訳の紙手元ありで読む
  66. @ウィリアム・バロウズ『裸のランチ』 事故で妻を殺した麻薬常習者の錯乱が生み出すおぞましい幻覚 電子もあるが紙版で読み出したが内容があまりに支離滅裂なので『ジャンキー』に変更したら少しましな犯罪記録。。。
  67. @ヘンリー・ミラー『北回帰線』性の躍動と欲望の噴出を歌い上げる言葉の奔流! 電子はない紙版で読み出す
  68. 関連文書 ◯コクトー「おそるべき子供たち」悲劇的な近親相姦心理劇
  69. ーーーー中国などーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  70. @ビギクラ 紅楼夢抄録 清代の恋愛模様(従兄弟婚や男色も)、@聊斎志異。。。。
  71. 余華 血を売る男 閻 連科 愉楽、四書、@聊齋本紀、@心経 莫言 蛙鳴
  72. ◯高行健 『ある男の聖書』 正統派モダニズム作家 文化大革命の激動期を生き抜いた亡命作家が、過去の記憶を「彼」、現在の自分を「おまえ」という二人称・三人称を用いて淡々と記述し、個人の記憶、アイデンティティー、そして歴史の真実を追究する物語 紙版で読む 
  73. ▽駱駝のシヤンッ?、▽寒い夜?、
  74. 関連 ▽大菩薩峠全話、▽エジプト史、▽徒然草の歴史学、
  75. @ダーバビルのテス、@マンスフィルド・パーク、
  76. @ミドルマーチ1(映画も見るか。。。)、
  77. 〇フィル・クレイ 「一時帰還」 イラク戦争従軍の海兵隊員群像
  78. 〇レイモン・クノー 地下鉄のザジ 母親とパリにやって来た少女ザジは芸人の叔父に預けられるが、彼女の楽しみは地下鉄に乗る事。だがストで地下鉄が動いていないと知ったザジは、ひとりで街へくりだしてしまう......。ザジがパリを離れるまでの36時間の冒険をスラップスティック調で描いたコメディ
  79. ▽蜘蛛女のキス(アルゼンチンの汚い戦争が背景) 映画半分みた。。。
  80. ▽夜のみだらな鳥(ピノチェト前夜のチリが背景)
  81. ▽ギリシャ悲劇三人全話、▽ホメーロス、
  82. ▽ディカーニカ、▽フランダース、
  83. ▽宇治拾遺集、▽謡曲集、
  84. ▽源氏物語、▽岡本かのこ集、▽プラトン(パイドロス)、

2025年12月26日金曜日

PICO Wで音出し cf 加速度・角速度は未はんだ(倒立振り子用)メムマイク

 mp3player,audio recorder,human voice synthesizerは成功ずみ,memsマイクは未踏、max98357は2個とも実施後にusb interfaceがあかんようになり再起動必要であきらめた

結局単純なドレミでOK牧場とした

from machine import Pin, PWM

import utime

# GP0をPWM出力に設定

buzzer = PWM(Pin(0))

# 音階と周波数の対応表 (Hz)

notes = {

    'do': 262,

    're': 294,

    'mi': 330,

    'fa': 349,

    'so': 392,

    'la': 440,

    'si': 494,

    'do2': 523

}


def play_tone(frequency, duration):

    if frequency == 0:

        buzzer.duty_u16(0) # 無音(休符)

    else:

        buzzer.freq(frequency) # 周波数を設定

        buzzer.duty_u16(32768) # デューティ比50%で音を鳴らす

    

    utime.sleep_ms(duration)

    buzzer.duty_u16(0) # 音を止める

    utime.sleep_ms(50) # 音の切れ目を作るための短い休止


# ドレミファソラシドを順番に鳴らす

scale = ['do', 're', 'mi', 'fa', 'so', 'la', 'si', 'do2']


for note in scale:

    print(f"Playing: {note}")

    play_tone(notes[note], 400) # 各音を400ms鳴らす


# プログラム終了時に確実に止める

buzzer.deinit()

ーーーーーーーーーちょうちょは以下のごとしーーーーーーーーーーーーーーーーーーーー

from machine import Pin, PWM

import utime


buzzer = PWM(Pin(0))


# ハ長調

notes = {

    'C': 262,

    'D': 294,

    'E': 330,

    'F': 349,

    'G': 392,

    'A': 440,

    'C2': 523,   # 高いド

    'rest': 0

}


def play(f, t):

    if f == 0:

        buzzer.duty_u16(0)

    else:

        buzzer.freq(f)

        buzzer.duty_u16(32768)

    utime.sleep_ms(t)

    buzzer.duty_u16(0)

    utime.sleep_ms(40)


# 🦋 ちょうちょ ちょうちょ

melody = [

    ('G', 400), ('E', 400), ('E', 800),

    ('F', 400), ('D', 400), ('D', 800),


    # なーのはに とーまれ

    ('C', 400), ('D', 400), ('E', 400), ('F', 400),

    ('G', 800),


    ('rest', 400)

]


for n, t in melody:

    play(notes[n], t)


buzzer.deinit()


Pico W + MAX98357A(chatgpt) https://www.otosozai.com/se1_1.htmlよりステレオ音源とったが、、、

一度はうごいたがその後無音に。。。。製品が2個とも悪いのかも、あきらめた

 **「ステレオ WAV でも再生できる」**ようにします。

やり方は ステレオ → モノラルにソフトで変換(L+R を平均)して I2S に流す方式です。
👉 MAX98357A が モノラル接続でも確実に鳴る一番安全な方法です。


方針(重要)

  • WAV が

    • モノラル → そのまま再生

    • ステレオL/R を平均してモノラル化して再生

  • 対応フォーマット

    • PCM

    • 16bit

    • mono / stereo 両対応


ステレオ対応版:WAV 再生コード(Pico W + MAX98357A)

from machine import Pin, I2S import struct # ============================== # I2S ピン設定 # ============================== BCLK_PIN = 10 # GP10 WS_PIN = 11 # GP11 DIN_PIN = 12 # GP12 WAV_FILE = "test.wav" # ============================== # WAV ヘッダ解析 # ============================== def read_wav_header(f): if f.read(4) != b'RIFF': raise ValueError("RIFF形式ではありません") f.read(4) if f.read(4) != b'WAVE': raise ValueError("WAVE形式ではありません") # fmt チャンク探索 while True: cid = f.read(4) size = struct.unpack("<I", f.read(4))[0] if cid == b'fmt ': fmt = f.read(size) break else: f.seek(size, 1) audio_format, channels, sample_rate = struct.unpack("<HHI", fmt[:8]) bits = struct.unpack("<H", fmt[14:16])[0] print("==== WAV 情報 ====") print("チャンネル数 :", channels) print("ビット深度 :", bits) print("サンプル周波数:", sample_rate, "Hz") if audio_format != 1: raise ValueError("PCM形式のみ対応") if bits != 16: raise ValueError("16bitのみ対応") if channels not in (1, 2): raise ValueError("mono / stereo のみ対応") # data チャンク探索 while True: cid = f.read(4) size = struct.unpack("<I", f.read(4))[0] if cid == b'data': return sample_rate, channels, size else: f.seek(size, 1) # ============================== # ステレオ → モノラル変換 # ============================== def stereo_to_mono(data): out = bytearray(len(data) // 2) for i in range(0, len(data), 4): l = struct.unpack_from("<h", data, i)[0] r = struct.unpack_from("<h", data, i + 2)[0] m = (l + r) // 2 struct.pack_into("<h", out, i // 2, m) return out # ============================== # WAV 再生 # ============================== with open(WAV_FILE, "rb") as f: rate, channels, data_size = read_wav_header(f) audio = I2S( 0, sck=Pin(BCLK_PIN), ws=Pin(WS_PIN), sd=Pin(DIN_PIN), mode=I2S.TX, bits=16, format=I2S.MONO, rate=rate, ibuf=40000 ) print("▶ 再生開始") BUF_SIZE = 1024 * (2 if channels == 2 else 1) remaining = data_size while remaining > 0: raw = f.read(min(BUF_SIZE, remaining)) if not raw: break if channels == 2: raw = stereo_to_mono(raw) audio.write(raw) remaining -= len(raw) audio.deinit() print("■ 再生終了")
-------------------------------------------------------------

2025年12月24日水曜日

TB6612使用 Dual DCモータードライブキット 秋月 (uno/pic)

 akizukidenshi.com は、ピンの位置が微妙にずれているので要注意

真ん中の3本がgnd,stby,vccになっている stbyはポジティブにセットしておく方法とプログラムでセットするやり方がある、後者のほうがベターだが配線がめんどい 以後は前者

const int motorPWM = 3;

const int motorAin1 = 4;

const int motorAin2 = 5;

int motorSpeed = 100; // pwmのデューティ比で0~255で調整

void setup() {

   // declare pin 9 to be an pwm output:

   pinMode(motorPWM, OUTPUT);

   pinMode(motorAin1, OUTPUT);

   pinMode(motorAin2, OUTPUT);

}


void loop() {

  analogWrite(motorPWM, motorSpeed);

  digitalWrite(motorAin1, LOW);

  digitalWrite(motorAin2, HIGH);

  delay(3000);

  digitalWrite(motorAin1, HIGH);

  digitalWrite(motorAin2, LOW);

  delay(3000);

}



2025年12月21日日曜日

pic16f18325 no-mcc aqm0802

http://machoto2.g2.xrea.com/page/P16F18325/P18325_M01.htm ばっちり動いた

 main.c

/*********************************************************************
 * データをLCDに表示する。 1MHz (内部クロック)
 * RC5 SCL
 * RC4 SDA
 *
 * PIC16F18325  MPLAB X IDE with XC8
 * Copyright (c) 2017 iwamoto All Rights Reserved
 * *******************************************************************/
#define _XTAL_FREQ 1000000

#include <xc.h>
#include <stdio.h>
#include "LCDi2c.h"
//******************* コンフィグレーション ****************************
#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = ON,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF

// ******************* main ******************************************
void main() {
    i2c_int();
    LCD_int();                  // LCDを初期化
    printf("LCD Test");
    LCD_posyx(1,1);             // 下段にカーソル移動
    printf("%04X",0x12AB);      // 数値をHEX表示する
    while(1);
}

LCDi2c.h

/*
 * File:   LCDi2c.h
 *  データをLCDに表示する。
 *    秋月(ACM1602NI)I2C LCD表示器を使用
 *          1MHz (内部クロック)
 * RC5 SCL
 * RC4 SDA
 *
 * PIC16F18325  MPLAB X IDE with XC8
 * Copyright (c) 2017 iwamoto All Rights Reserved
 ** Author: ki
 * Created on October 21, 2017, 11:53 AM
 */

#ifndef _XTAL_FREQ
#define _XTAL_FREQ 1000000
#endif

 //*************************************************
 //  調整用定数
 //*************************************************
 #define CONTRAST  0x28          // for 3.3V
 // #define CONTRAST  0x18       // for 5.0V


 // プロトタイプ *******************************
 void i2c_int(void);
 void i2cByteWrite(char, char, char);
 void i2cTxData(char);
 void LCD_dat(char);
 void LCD_cmd(char);
 void LCD_clr(void);
 void LCD_posyx(char,char);
 void LCD_int(void);

 void LCD_str(char *);
 void LCD_ROMstr(const char *);

LCDi2c.c

/* ************************************
 *  File:   LCDi2c.c
 * プログラム例
 *      int a = 1234;
 *      printf("%d %o %x\n", a, a, a);
 *      printf("%s %c\n", "abc", 'x');
 * 結果 -------------------------------
 *      1234 2322 4d2
 *      abc x
 * *************************************/
#include <xc.h>
#include <stdio.h>
#include "LCDi2c.h"

//******************************************************
// LCD で printf関数が使用できるようにするため putch を設定する
//******************************************************
void putch(char data) {
        LCD_dat(data);      // LCD への一文字表示関数
}

//******************************************************
// I2C 関連 RC5 SCL, RC4 SDA
//******************************************************
void i2c_int(void){
    TRISC4 = 1;             // RC4を入力にする
    TRISC5 = 1;             // RC5を入力にする
    ANSC4  = 0;             // RC4をデジタルIO
    ANSC5  = 0;             // RC5をデジタルIO
    ODCC4  = 1;             // RC4をオープンドレイン
    ODCC5  = 1;             // RC5をオープンドレイン
    LATC4  = 1;             // RC4をオープンにする
    LATC5  = 1;             // RC5をオープンにする
    WPUC4  = 1;             // RC4弱プルアップ ON
    WPUC5  = 1;             // RC5弱プルアップ ON
    RC4PPS     = 25;        // RC4をDAT出力に指定
    RC5PPS     = 24;        // RC5をCLK出力に指定
    SSP1DATPPS = 0x14;      // RC4をDATに入力指定
    SSP1CLKPPS = 0x15;      // RC5をCLK入力に指定

    // SSP1設定 ------------------------------------------
    SSP1STAT = 0b10000000;     // スルーレート制御はOff
    SSP1ADD  = 1;              // クロック設定 125k@1MHz
    SSP1CON1 = 0b00101000;     // I2C Master modeにする
}
//-------- ByteI2C送信
void i2cByteWrite(char addr, char cont, char data){
    SSP1CON2bits.SEN = 1;      // Start condition 開始
    while(SSP1CON2bits.SEN);   // Start condition 確認
    i2cTxData(addr);           // アドレス送信
    i2cTxData(cont);           // 制御コード送信
    i2cTxData(data);           // データ送信
    SSP1CON2bits.PEN = 1;      // Stop condition 開始
    while(SSP1CON2bits.PEN);   // Stop condition 確認
}
//-------- Data送信
void i2cTxData(char data){
    PIR1bits.SSP1IF = 0;       // 終了フラグクリア
    SSP1BUF = data;            // データセット
    while(!PIR1bits.SSP1IF);   // 送信終了待ち
}
//********************************************************
// LCD 関連
//********************************************************
//-------- 1文字表示
void LCD_dat(char chr){
    i2cByteWrite(0x7C, 0x40, chr);
    __delay_us(50);            // 50μsec
}
//-------- コマンド出力
void LCD_cmd(char cmd){
    i2cByteWrite(0x7C, 0x00, cmd);
    if(cmd & 0xFC)             // 上位6ビットに1がある命令
        __delay_us(50);        // 50usec
    else
        __delay_ms(2);         // 2msec ClearおよびHomeコマンド
}
//-------- 全消去
void LCD_clr(void){
    LCD_cmd(0x01);             //Clearコマンド出力
}
//-------- カーソル位置指定
void LCD_posyx(char ypos, char xpos){
    unsigned char pcode;
    switch(ypos & 0x03){
        case 0:    pcode=0x80;break;
        case 1:    pcode=0xC0;break;
    }
    LCD_cmd(pcode += xpos);
}
//-------- 初期化
void LCD_int(void){
    __delay_ms(100);
    LCD_cmd(0x38);             // 8bit 2行 表示命令モード
    LCD_cmd(0x39);             // 8bit 2行 拡張命令モード
    LCD_cmd(0x14);             // OSC  BIAS 設定1/5
                               // コントラスト設定
    LCD_cmd(0x70 + (CONTRAST & 0x0F));
    LCD_cmd(0x5C + (CONTRAST >> 4));
    LCD_cmd(0x6B);             // Ffollwer
    __delay_ms(100);
    __delay_ms(100);
    LCD_cmd(0x38);             // 表示命令モード
    LCD_cmd(0x0C);             // Display On
    LCD_cmd(0x01);             // Clear Display
}
//-------- 文字列出力
void LCD_str(char *str){
    while(*str)                //文字列の終わり(00)まで継続
        LCD_dat(*str++);       //文字出力しポインタ+1
}
//-------- Rom 文字列出力
void LCD_ROMstr(const char *str){
    while(*str)                //文字列の終わり(00)まで継続
        LCD_dat(*str++);       //文字出力しポインタ+1
}

2025年12月20日土曜日

HSPのhspext.asは超便利

#include "hspext.as"

    com_port = 10 ; arduinoのシリアルモニタは使えなくなる

    com_baud = "baud=9600 parity=N data=8 stop=1"

    comopen com_port, com_baud

    if stat != 0 : dialog "COMポートを開けませんでした。": end

    mes "COM" + com_port + " を開きました。"

    ; --- 重要:Arduinoがリセットから立ち上がるのを待つ --- これがないと

ArduinoはPCから接続(comopen)された瞬間に再起動(リセット)がかかります。

    mes "Arduinoの準備を待っています..."

    wait 300  ; 3秒間待機(これがないと送信データが無視されます)

再起動中のArduinoはデータを受け取れないため、送信前に待ち時間を入れる必要があります。

    ; --- データの送信 ---

    comput "Hello HSP3.7"

    mes "データを送信しました。LEDが4秒間光るはずです。"

    ; 送信が物理的に完了するまで少し待ってから閉じる

    wait 100 

    comclose

    mes "ポートを閉じました。"

    stop

----------------対応arduino code-----------------

void setup() {
  // 内蔵LED(13番ピン)を出力モードに設定
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW); // 最初は消灯
  // HSP側の設定に合わせて 9600bps で開始
  Serial.begin(9600);
}

void loop() {
  // シリアルバッファにデータが届いているか確認
  if (Serial.available() > 0) {
    // 送信された文字列を読み取る
    String data = Serial.readString();
    // 受信した文字列に "Hello HSP3.7" が含まれているか判定
  // これならcr/lf処理が省けるので便利
    if (data.indexOf("Hello HSP3.7") != -1) {
      digitalWrite(LED_BUILTIN, HIGH); // LEDを点灯
      delay(4000);
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}


2025年12月18日木曜日

aqm1602 on pic16f18857(gokan IOT pedia)

 /***********IOT 3.2.1yori*******************************

 *  I2C接続のセンサとLCDを使う mccだけでOK すばらしい

 *  温湿度、気圧の表示

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

#include "mcc_generated_files/mcc.h"

#include "mcc_generated_files/examples/i2c1_master_example.h"

//#include "mcc_generated_files/weather.h"

// 変数定義

uint8_t Flag;

double temp, humi, pres;

char Line1[17], Line2[17]; // aqm1602は16x2 17は多すぎ

char Line1[]="0123456789012345";

char Line2[]="0000000000000000";

// 液晶表示器 コントラスト用定数

//#define CONTRAST  0x18    // for 5.0V

#define CONTRAST  0x25        // for 3.3V  bme280併用時はこれで

// 関数プロト

void lcd_data(char data);

void lcd_cmd(char cmd);

void lcd_init(void);

void lcd_str(char * ptr);

/***** タイマ0割り込み処理関数******/

void TMR0_Process(void){

    Flag = 1;

}

/***** メイン関数 ******/

void main(void)

{

    SYSTEM_Initialize();                    // システム初期化

    TMR0_SetInterruptHandler(TMR0_Process);

    INTERRUPT_GlobalInterruptEnable();

    INTERRUPT_PeripheralInterruptEnable();    

    lcd_init();                             // LCD初期化

    /****** メインループ ************/

    while (1)

    {    

        if(Flag == 1){

            Flag = 0;

            /** センサデータ読み出し **/

            //Weather_readSensors();

            //temp = Weather_getTemperatureDegC();

           // humi = Weather_getHumidityRH();            

            //pres = Weather_getPressureKPa() * 10;

            // 表示データ編集

           

           // sprintf(Line1, "T=%2.1fC  H=%2.1f%%", temp, humi);

           //              sprintf(Line2, "P=%4.1f hPa", pres);

            // LCD表示

            lcd_cmd(0x80);                      // 1行目

            lcd_str(Line1);

            lcd_cmd(0xC0);                      // 2行目

            lcd_str(Line2);

        }

    }

}

/****** 液晶表示器ライブラリ ***************/

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

* 液晶へ1文字表示データ出力

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

void lcd_data(char data){

    I2C1_Write1ByteRegister(0x3E, 0x40, data); 

    __delay_us(30);                             // 処理待ち遅延

}

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

* 液晶へ1コマンド出力

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

void lcd_cmd(char cmd){

    I2C1_Write1ByteRegister(0x3E, 0x00, cmd);

    /* ClearかHomeのとき長遅延 */

    if((cmd == 0x01)||(cmd == 0x02))

        __delay_ms(2);                  // 2msec待ち

    else

        __delay_us(30);                 // 30μsec待ち

}

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

* 液晶表示器 文字列表示関数

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

void lcd_str(char * ptr){

    while(*ptr != 0)                    // 文字列最後まで

        lcd_data(*ptr++);               // 文字表示実行

}

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

*  液晶表示器 初期化関数

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

void lcd_init(void){

    __delay_ms(150);                    // ハード初期化待ち

    lcd_cmd(0x38);                      // 8bit 2line Normal mode

    lcd_cmd(0x39);                      // 8bit 2line Extend mode

    lcd_cmd(0x14);                      // OSC 183Hz BIAS 1/5

    /* コントラスト設定 */

    lcd_cmd(0x70 + (CONTRAST & 0x0F));

    lcd_cmd(0x5C + (CONTRAST >> 4));

//    lcd_cmd(0x6B);                    // Follower for 5.0V

    lcd_cmd(0x6B);                      // Follwer for 3.3V

    __delay_ms(300);

    lcd_cmd(0x38);                      // Set Normal mode

    lcd_cmd(0x0C);                      // Display On

    lcd_cmd(0x01);                      // Clear Display

}