Minimum Viable Arduino Project: Aeropress Timer

2025/12/03 3:48

Minimum Viable Arduino Project: Aeropress Timer

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:


Summary

このプロジェクトは、Adafruit Trinket M0 マイクロコントローラを中心に構築されたUSB電源付きの30秒タイマーで、Aeropress コーヒーマシン用です。

  • ハードウェア: アルミニウム製プッシュボタンが1つだけで、Pin 0 と GND に接続されます。内部プルアップ抵抗を利用してデバウンス処理を行います。Pin 1 にはピエゾブザーがあり、オーディオフィードバックを提供します。Trinket の内蔵 Neopixel RGB LED は毎秒緑色に点滅し、経過した各秒を視覚的に確認できます。
  • ファームウェア: コードはボタンのデバウンスを 30 ms の遅延で行い、押下時に1秒間隔のループを開始します。開始と終了時には短く chirp 音が鳴り、タイマー完了後に LED をオフにします。小規模なカラー テストルーチンで緑と赤の配線が正しいこと(初期は逆だった)を確認しました。
  • エンクロージャ: デバイスは OpenSCAD で設計された単一ユニボディ3Dプリントパーツに収められています。統合ブザークリップがあり、以前のレーザーカット木製プロトタイプを置き換えました。USB 電源が基板に供給され、Trinket の側スロットから LED がキッチンカウンターへ照射されます。
  • 範囲と将来作業: 本設計はバッテリー充電回路やディープスリープモードを意図的に省略し、構築時間を数時間の週末作業に抑えています。予定される改良点には、ブザーの二進制モード調整、LED の再配置による照射改善、あるいはより高度なタイミングオプションの追加が含まれます。

完成したツールは低コストでプラグ&プレイ可能であり、複雑な電力管理を必要とせずに信頼性の高いタイミングとフィードバックを提供できることを示しています。

本文

プロジェクト概要

これは最小限ながら実用的な Arduino プロジェクトです。Adafruit Trinket M0 をベースに、エアロプレス用の専用 30 秒タイマーを作成します。

  • ハードウェア

    • Trinket M0(USB 電源)
    • アルミ製ボタン(ピン 0 に接地、内部プルアップ使用)
    • ピエゾブザー(ピン 1)
    • ボード上の Neopixel RGB LED(視覚フィードバック用)
  • 筐体

    • OpenSCAD で設計し、Ultimaker で印刷
    • シングルユニボディ構造。ブザー用クリップと USB ポートが側面開口にフラッシュ

このタイマーの必要性

エアロプレスは正確に 30 秒後にプランジを行う必要がありますが、手動でタイマーを設定すると誤差が生じやすいです。本プロジェクトは簡単で電池不要な設計で、USB に接続したままで使用できるため、その煩わしさを解消します。


コード

#include <Adafruit_DotStar.h>

const int PIN_BUTTON = 0;
const int PIN_BUZZER = 1;

Adafruit_DotStar strip(1, 7, 8, DOTSTAR_BGR);

void setup() {
    pinMode(PIN_BUTTON, INPUT_PULLUP);
    pinMode(PIN_BUZZER, OUTPUT);
    digitalWrite(PIN_BUZZER, LOW);

    strip.begin();
    strip.setBrightness(255);
    colorTest();          // 電源投入時に LED テスト
}

void colorTest() {
    const unsigned int COLORS[] = {
        strip.Color(0, 0, 0),     // 消灯
        strip.Color(255, 0, 0),   // 赤
        strip.Color(0, 0, 0),
        strip.Color(0, 255, 0),   // 緑
        strip.Color(0, 0, 0),
        strip.Color(0, 0, 255),   // 青
        strip.Color(0, 0, 0)
    };

    for (int i = 0; i < 7; ++i) {
        strip.setPixelColor(0, COLORS[i]);
        strip.show();
        delay(100);
    }
}

void loop() {
    const int TIMER_DURATION = 30;   // 秒

    waitForButton();   // ユーザー入力待ち
    startBeep();       // 短いブザーで確認音

    for (int sec = 0; sec < TIMER_DURATION; ++sec) {
        strip.setPixelColor(0, strip.Color(
            0,
            (sec % 2 == 0) ? 0 : 255,   // 毎秒緑色を点滅
            0));
        strip.show();
        delay(1000);
    }

    endBeep();                 // タイマー終了通知
    strip.setPixelColor(0, strip.Color(0, 0, 0));
    strip.show();
}

void waitForButton() {
    int previous = HIGH;
    unsigned long lastDebounce = 0;
    const unsigned long debounceDelay = 30;

    while (true) {
        int state = digitalRead(PIN_BUTTON);
        if (state != previous) {
            lastDebounce = millis();
            previous = state;
        }
        if ((millis() - lastDebounce) > debounceDelay && state == LOW) {
            return;   // ボタンが押された
        }
    }
}

void startBeep() {
    digitalWrite(PIN_BUZZER, HIGH);
    delay(40);
    digitalWrite(PIN_BUZZER, LOW);
}

void endBeep() {
    for (int i = 0; i < 3; ++i) {
        digitalWrite(PIN_BUZZER, HIGH);
        delay(20);
        digitalWrite(PIN_BUZZER, LOW);
        delay(250);
    }
}

結果

タイマーはキッチンに設置されます。眠そうなユーザーが朝にボタンを押すだけで、デバイスは一度ブザー音を鳴らし、緑色LEDを点滅させながら 30 秒カウントダウンします。そして再びブザーで終了を知らせ、エアロプレスのプランジ作業へ移行できるようにします。

同じ日のほかのニュース

一覧に戻る →

2025/12/08 2:18

I failed to recreate the 1996 Space Jam website with Claude

## Japanese Translation: ## 要約 著者は、Claude AI を使って 1996 年の Warner Bros の「Space Jam」ランディングページをスクリーンショットとアセットフォルダから再構築しようとしました。元のサイトは 200 KB 未満の単一 HTML ファイルで、絶対位置決め、テーブルレイアウト、およびタイル状の星空 GIF 背景に依存しています。 **プロセスと所見** 1. **初期試行:** Claude は概算レイアウトを生成しましたが、惑星軌道を誤った位置に配置しました。軌道パターンは認識できたものの、それを再現することには失敗しました。 2. **構造化プロンプト:** 著者は Claude に「知覚分析」「空間解釈」「再構築計画」の各セクションで理由を説明させ、正確なピクセル座標を要求しましたが、Claude はそれらを提供できませんでした。 3. **カスタムツール:** 精度向上のために 50 px → 5 px のグリッドオーバーレイ、ラベル付き座標参照点、色差比較、スクリーンショットサイドバイサイドビューア、およびスクリーンショットを 6 区域に分割するスクリプトを構築しました。 4. **結果:** Claude の調整は目標から 5–10 px 内に留まりましたが、正しい軌道半径(約 350–400 px)には決して収束しませんでした。内部レイアウトが生成されると、その後のフィードバックは元のスクリーンショットではなく、この誤ったモデルに基づいて行われました。 5. **トークナイズ仮説:** 著者は Claude が 16×16 パッチで画像をトークナイズしているため、細かい視覚的粒度が欠如し、セマンティック理解はあるもののピクセル精度が低いと考えました。 6. **ズームインテスト:** 200 % に拡大したスクリーンショットを提供して、大きなパッチで解像度が向上するか確認しましたが、Claude は依然として比例スケーリング指示に従いませんでした。 **結論** このタスクは未解決のままです。実験は Claude の空間推論限界をベンチマークとし、ピクセル単位で正確な画像再構築におけるモデルの現在の制約を示しています。

2025/12/08 7:18

How I block all online ads

## Japanese Translation: > **概要:** > 著者は、ウェブブラウザとモバイルアプリの両方で広告を排除するために長期的かつ多層的なアプローチを説明しています。彼は **Firefox + uBlock Origin** と最小限のフィルタリスト(組み込みのuBlockフィルタ、EasyList、AdGuard – Ads)と「広告でない不快要素」のためのカスタム非広告フィルタを使用します。 > DNS フィルタリングには **Pi‑hole(または AdGuard Home)** を Docker 上で $5 の DigitalOcean ドロップレットに稼働させ、WireGuard VPN の DNS サーバとして設定しています。トラフィックは **クラウドベースの VPN**(DigitalOcean、Hetzner、Azure、Google Cloud、または AWS)を経由し、プラットフォームが公的クラウド IP を検知して広告配信を減らします。 > この設定では **Cloudflare のキャプチャや HTTP エラー** が発生する場合があるため、著者は該当サイトで VPN を無効化しています。また、**Consent‑O‑Matic**(クッキーポップアップ)、**Buster**(キャプチャ)、**SponsorBlock**(動画広告)などのブラウザ拡張機能を推奨します。iOS では **Background App Refresh** をオフにするとデータ収集が減少し、Android では **ReVanced がアプリをパッチできますが、セキュリティリスクがあります** と指摘しています。 > 著者はこの統合戦略を 3 年以上使用しており、現在ほとんど広告を見ることはありません。プラットフォーム別の効果は異なります:YouTube は uBlock Origin + VPN(1週間〜1か月)が必要;Instagram は uBlock Origin のみで十分;Twitch は主に VPN に依存し、数日で効果が現れます;TikTok は両方のツールを使用しますが、数時間だけです。**AdMob** を利用するアプリも DNS ブロックの恩恵を受けます。 > 広告配信ネットワークは数日から数週間でパターンを観察し調整する可能性があるため、継続的な監視が必要です。著者は **Firebog** をブロックリストの良い情報源として引用し、正当なサイトを壊さないように許可リスト(allowlist)を維持する重要性を強調しています。

2025/12/07 23:37

Dollar-stores overcharge cash-strapped customers while promising low prices

## Japanese Translation: ドルジェネラルとファミリードラーは、棚に貼られたタグの価格よりも高い価格で顧客を頻繁に請求し、低所得層の買い物客に不釣り合いな過剰課金が広く発生しています。州検査と独立調査では、一部店舗でエラー率が88%に達するケースや、両チェーン全体で価格設定失敗が一貫して報告されています。 主な例としては、ノースカロライナ州ウィンザーのファミリードラーで23%のスキャンアイテムが過剰請求(同店の4回連続失敗)、オハイオ州ハミルトンのドルジェネラルで76%のエラー率(2022年10月)、ニュージャージー州バウンドブルックのファミリードラーで68%の不一致(2023年2月)があります。2022年1月以降、ドルジェネラルは4,300件以上、ファミリードラーは2,100件以上の価格失敗事例を記録しています。 アリゾナ州(60万ドル)、コロラド州(40万ドル)、ニュージャージー州・バーモント州・ウィスコンシン州・オハイオ州(最大100万ドル)など複数の州がチェーンと訴訟を和解し、連邦および州の司法長官は追加訴訟を提起しています。株主訴訟では、経営陣がシステム的問題を認識していたと主張されています。ニュージャージー州の連邦裁判所は、モバイルアプリ利用に関連する仲裁条項を理由にドルジェネラルに対する集団訴訟を停止し、消費者の救済手段を制限しました。 規制当局は現在の1検査あたり5,000ドル上限を超えるより厳格な執行や高い罰則を課すことができ、さらに州が調査を進めるにつれて追加の和解が生じる可能性があります。影響としては顧客信頼の低下、チェーンへの潜在的財務損失、評判へのダメージ、およびドルストア業界全体での価格設定と人員管理の強化への動きが挙げられます。