2020年8月16日日曜日

基板ホルダー:Fusion360超入門

 AliExpressから買ったはんだ付け作業用基板ホルダー。表面実装用としては使いやすいんですが、コネクタなどを裏面ではんだ付けするには高さが足りません。

なので、基板をくわえ込む爪?を3Dプリントします。左右用と中央用の2種類がありますが、出力の都合で左右用を別に作ります。

今回のテーマは、似たようなものを3つ作る、です。似たようなもの、というか寸法が同じ出左右対称なんてものを作る時にスケッチを3枚作ってしまうとサイズ変更が生じた時の手間が大変です。1枚のスケッチを使いまわして、押し出しで左右対称にし、もう一枚スケッチを追加して違う向きの穴を開けています。

■スケッチから■

基本の図形を書きます。四角い穴の向きは中央用と左右用では異なりますが、中央用は後で書きます。

■立体にする■

押し出しで、下の枠部分を作ります。スケッチの平面を基準面として対象に2.5mmにします。

上の爪部分を2.5mm、今度は片側だけ押し出します。


■フィレットと面取り■

角張っていると欠けやすいのでフィエットを付け、ビルドプレートと密着する面=画面では上になりますが、ここのすべての辺を剥がしやすくするためと密着面が太ることを見越して面取りします。穴部分の面取りもお忘れなく(私は忘れて出力しなおしになりました……穴を棒が通らなくてですね)。


■移動■

では、左右反対側の爪を作ります。今作ったボディは邪魔なので、ボディ1を選択してから修正>移動で左右どちらかに15mmほど移動します。


■立体、フィレット+面取り、移動■

では次。また押し出し(対象2.5mm)で棒の通る部分を作ってから、さっきとは異なり基準面の下に2.5mm押し出します。

で、フィレットと面取りですが、さっきは画像上の面にフィレットを付けましたが、今度は下に付けます。


■また移動■

ボディ2をクリックして、修正>移動で、今作ったやつをどけます。


■中央の爪を作る■

押し出し(対象2.5mm)でボディを作りますが、左右対称の形なので全体を対象押し出しとし、穴の向きが違うので穴の部分を埋めています。

穴の通る向きに垂直なスケッチを作り、そこに「中心の長方形」で5.5mmの長方形を書きます。作図の邪魔なのでスケッチ1とボディ1とボディ2は一時的に非表示にします。

この四角を押し出しで穴にします。ボディ3が表示されているとスケッチを選べないので、押し出しを選んだ後でボディ3を非表示にし、上で描いた四角を選び、対象5mmを切り取ります。5mmじゃなくていいんですが、大きめに切り抜いておくとサイズ変更したときに残っちゃった、なんてことがないので(ただ大きすぎて隣を切り取ってしまうこともありますので注意)。

で、3Dプリンタの特性上、穴が垂直になるように出力する必要がありますので、底になる面を密着面とし、フィレットと面取りを入れます。

できたー。


■出力し、使ってみた■


2020年8月15日土曜日

亀の餌カウンター:Fusion360超入門

 

亀の餌、きちんと計量することで巨大化を抑制しています。が、20x2個毎朝数えるのはめんどくさいです。が、Twitterでこの投稿を見て、「その手があったか!」と。

てことで、作りました。

■Fusion360■

まず基礎採寸。ボトルの直径が8cm、餌は直径5mm高さ10mmの円筒形です。

てことで、スケッチでボトルに入るサイズの四角50x50mmと持ち手を書きます。四角は中心指定の四角形、持ち手の部分は線分で書きました。突っ込む部分の丸みは三点指定の円弧です。

これに押し出しで厚みをつけます。スケッチのプロファイル全体を指定して、4mmにします。

くぼみは、円弧を断面として指定したいので断面に垂直な面(白くなっている面)をスケッチ面として書きます。

円弧は三点指定の円弧を使います。餌が5mmなので、楽に入るように7mmの溝にしましょうか。中心から3.5mm→-3.5mm、高さ2.5mmの円弧を書き、始点と終点を線分でつなぎます。

押し出しでこれを溝にします。長さ約10mmなので余裕を見て14mmにします。

矩形状パターンで増やします。

スコップ?先端に面取りをして餌の中に刺さりやすくして

プリンタで出力後にはがしやすくするための面取り0.5mmを底面を囲うように入れてから、角張っているところをフィレットで丸くします。

こちらからダウンロードできます。

ChituBoxでは例によって平面をべったりと底に貼り付ける面で出力します。

ペットの餌用なので硬化後の化学物質漏出が少ないらしいレジンを使って出力しました。漏出抑制のために後硬化を長くし、新品のIPAと石鹸でよく洗いました。

使ってみたのが冒頭の動画です。

縦溝の方が振り落としやすかったかしら。

2020年8月12日水曜日

鉛フリーへ移行

 RoHS司令がどうのということではなく、

  1. 単に鉛を含む共晶だとリフロー後の洗浄などで廃棄物処理が面倒くさい
  2. 鉛フリーでもきれいに仕上がるハンダが入手できた
  3. 協力会社などからも寿命などについて問題ないとの太鼓判をもらった
の3点です。

手ハンダは、千住金属工業ECO SOLDER GA-ST F2 M24AP-0.8。銀が入っていないので価格が安く、各種合金によって手ハンダでもきれいな光沢のある仕上がりになります。また、はんだ付け中の発煙が少なくフラックスの色が透明なので、無洗浄でもキレイです。

鉛フリーは松尾ハンダ株式会社のFLF01-BZを使っています。

コテ先全部交換ってのが地味にお金がかかりました……。

■CM■

倉橋屋では、
  • ESP32関連装置の設計、製造、ファームウェア開発、サーバーサイド開発
  • Raspberry Pi拡張用基板の設計製造、ソフト開発
  • 基板実装受託(Eagle設計ファイルとBOM支給)
なども取り扱っております。1枚からお気軽に info@kurahashi-ya.com までご相談ください。

なお、製造にあたっては共晶ハンダをご指定いただくことも可能です。

2020年8月8日土曜日

いろいろ便利な「剣山」の作り方:Fusion360超入門

剣山を作ろうとしたわけではなく、エアキャップ(いわゆるプチプチなど、空気の入ったビニールのクッション材)を素早く脱気して処分するためにトゲの山を作った次第です。

でも、これが当初の目的のエアキャップ穿孔だけでなく、
  • ユニバーサル基板でレイアウト検討するときの作業台
  • ケーブルが逃げてウザい時の固定用

などにも便利に使えます。完成品はここからダウンロードできます(Fusion360)

■Fusion 360超入門■

  1. スケッチモードへ
  2. 作成→長方形→中心の四角形で適当なサイズの四角形を作ります。うちの3Dプリンタが奥行き60mmまでなので55mmの正方形にしました。
  3. 作成→円→中心と直径で指定した円でトゲの土台を描きます。とりあえず4mmにしました。
  4. スケッチモードを終了します。


底板を作ります。
  1. 作成→押し出し
  2. 基準面の下方向へ2mm押し出します(-2と入力)
  3. スケッチの全体を選ぶ。円の部分もちゃんと選びます。
  4. 操作が「新規」になっていることを確認してOK

確定するとFusionの仕様でスケッチが勝手に見えなくなってしまうので「スケッチ1」の左にある目玉アイコンをクリックして見えるようにします。




押し出しでトゲを作ります。
  1. 作成→押し出し、スケッチ上の円を選びます。
  2. 高さを30mmにして、テーパー角度を-5度にしてみます。

ん

テーパーが強すぎて30mmの手前で線になってしまいました。ドラッグして高さを調整するかテーパー角度を細かく刻で丁度いい角度を求めても良いのですが、MacやPCにも付属している関数電卓で「円の半径 / 高さのアークタンジェント」を求めます。この場合直径4mmで高さ30mmですから、2/30 atan で 3.814074834290354と出ましたから、これの頭にマイナスを付けてFusionにコピペすればピッタリ一致します。操作が「結合」になっていることを確認してOKすれば高さ30mmのトゲができます。

三角関数は生活の役に立つなぁ ^ ^

なお、尖りすぎていても良いことはないので(人生訓ではなく3Dプリンタから出力したときにちぎれたり完成後に凶器と化します。血ぃでます)、この状態で高さ25mmにすれば、いい感じで先が潰れます。でも尖ったまま人生を送るのも若さだと思います。


ここまで来ると邪魔なのでスケッチを消します。スケッチ1の横にある目玉をクリックすれば見えなくなります。

簡単な作業から先にします。

底板の角が尖っていると割れやすいのでフィレットで丸くします。
  1. 修正のフィレットを選ぶ
  2. 底板の四隅の縦線を選択します。適当にボディを回転させながら見やすい位置で選びましょう。慣れればそのまま選べますが、間違えると面倒ですし基本に忠実が一番っす。
  3. 丸さは好みですが、3ミリにしました。
  4. OKをクリックします。


定番の底、ビルドプレートに密着する部分の周囲に面取りをします。ビルドプレートに密着する箇所は硬化時間=紫外線照射時間が長くて太りやすいので、その分を削る意味と、ビルドプレートから剥がすときに刃が入りやすくるとためです。
  1. 下から見上げる角度にする
  2. 修正→面取りを選ぶ
  3. 底面の周囲線を選びます。さっきフィレットでつないだので1回クリックするだけで済みます。
  4. 0.5mmと入力します。照射時間長いのは0.3mmほどなので、それ+ちょっぴり。
  5. OKをクリックします。

トゲの根本にフィレットを入れて補強します。
  1. また見下ろす位置に動かします。
  2. 修正→フィレットを選びます。
  3. トゲの根本の輪っかを選びます。
  4. 2mmと入力しOK
ちょっとキモい。トゲを増やします。
  1. 作成→矩形状パターンを選びます。
  2. トゲと根本のフィレット部分を選びます。
  3. ダイアログの「方向」をクリックし、画面左の方にある「原点」をONにして赤か青、つまり基準面上にある軸をクリックします。ここでは赤をクリックします。
  4. ダイアログの「方向のタイプ」を2つとも「対象」にします。
  5. 「距離」に23と入力してみます。フィレットがはみ出さずギリギリ端に来ているのでこれでおk、もう一つの距離にも23と入力します。
  6. 「数量」でトゲを増やします。奇数でないと左右対称になりません。もうここはお好みで。7にしました。これも2つの入力欄に入れます。
  7. OKをクリックします。

ドーン。


あとは「ボディ1」を右クリックしてSTL化し、ChiTuBoxなどに読み込ませてスライスし、3Dプリンタで出力する、だけです。

SLAプリンタ入門については、こちらのノートをご覧いただけると幸いです。無料で最後まで読めます。

2020年8月6日木曜日

3Dプリントでステンシルと基板の位置合わせ

「ステンシルに基板のネジ穴と同じ位置に穴あけすれば、位置合わせが楽」

というアイディアを最初に見たのはTwitterだったと思います。その方はピンかなにかを使っておられましたが、3Dプリントでピン付きの台を出力してみたらいい感じになりました。

■Fusion 360で設計■

設計というほどのものではなく、内側の四角から順に
  1. 基板のハマる四角……3Dプリントが収縮しても良いように、基板よりほんの少し大きめに。
  2. ステンシルが乗る四角……これもステンシルより少し大きくします。
  3. 外形……レジンをケチるために小さくすると作業性が落ちますのでほどほどに。
  4. ネジ……2.6mmの円をネジと同じ位置に。
を並べて位置を合わせるだけです。



次にこれを立体にします。いずれも押し出しを使います。
  1. まず、全体のサイズを2mm、下方向に出力します。上がプラスなので-2mmですね。これは全体の土台になります。基板の厚さ、ステンシルの厚さ……などを計算するとめんどくさいので、私はいつも基準面よりも下に土台を出します。
  2. 基板は基準面に接してますので、その外側を押し出します。今回は1.0mmの基板を作ったので、1.0mm上に向けて押し出します。
  3. 外わくは基準面から基板厚+ステンシル厚を上に向けて出力します。今回は基板1.0mm+ステンシル0.1mmで1.1mmにしました。
  4. ネジ部分、今回はネジとネジの間に部品がないので、少し高めの3mmに押し出しましたが、間に部品がびっしりあるような場合にはスキージングのときの邪魔にならないように1.0+0.1+0.5mmぐらいにします。
ネジのてっぺんにフィレットで丸みを付けます。さっき+0.5mmしたのは、ここでフィレットを0.5mmにするためです。こういうところに丸みをつけておくと基板やステンシルがさっと穴にはまりますので、作業性が向上します。

最後に、3Dプリンタのビルドプレートからはがしやすくするように、底面に0.5mmの面取りをします。ビルドプレートにくっつく部分は、硬化時間が長いので太りやすく、その分を小さくしておかないとうまく刃が入りませんので。


■出力■

特に何もありませんが、私はこういう平面性が大事なものは、べったりとビルドプレートに接するように出力します。
ChiTuBoxにて

■結果■

ちょっと収縮が大きくてネジ間とネジ間が縮んでしまったのですが、ステンシルと基板にいい感じでテンションがかかってくれて、いい感じでフィットしました。トップの写真が顕微鏡写真です。小さい丸が0.2mmなので、いい精度出てます。

従来の方法だと位置合わせは結構たいへんで、微調整をするためにマスキングテープを貼って少しずつずらしたあとでべったり固定して……などとアナログ的な技術が必要だったのですが、これならば基板をはめてステンシルをはめて、ペースト塗布……それだけです。



末筆ながら、発案者の方に感謝申し上げます。


2020年7月27日月曜日

EagleでV-cutを指定してJLCPCBに注文する

*2020年07月29日 コピー手順を加筆しました。

V-cutは、端から端まで横断するV字の溝です。小さな基板を複数まとめて作り、実装が終わったところでポキンと折ります。スキージング回数は減るしpick&placeもまとめてできるし基板費用も安く済むので大変ありがたいです。

今までわたしは、Panel by JLCPCB、つまり1枚分の基板データを渡して、「あとは縦x枚、横y枚に割り付けてください」ってお願いするだけでした。

が、これだと同じ基板を複数作ることはできますが、異なった種類のものを同じ基板に割り付けるのは自分でやらないといけません。

ってことで、やってみました。

■コピー元のデータを用意する■

当然、Eagleを使って基板を設計します。今回は、秋月で売ってるGaN MOSFETブレイクアウト基板を2種類作りました。

■パネライズする■

出来上がったボードデータをそのままコピーしようとしても、部品番号が自動的にインクリメントされたりでうまくいきません。そこで、パネライズします。なお、パネライズしたあと、Saveしてはいけません。

パネライズはツールバーのオレンジ色の「Run ULPボタン」をクリックし、


検索欄にpaneと入力すると絞り込まれてpanelizeが残ります。panelizeをダブルクリックします。


これでtNames, bNamesが部品番号と切り離れた_tNames, _bNamesにコピーされます。

基板全体をGoup Copyし、SaveせずにWindowを閉じます(Panelizeした状態で上書きするとこの後の修正時などに掃除が大変)。

【追記07/29】全体のGroup Copyの際には 、以下の手順がオススメです。

  1. 表示LayerでShow Layersボタンを押して全レイヤーを選択
  2. 20 Dimensionだけを除外してOKボタン
  3. cmd+Aで全選択
  4. カーソル位置を原点にあわせて座標表示が0,0になるのを確かめてcmd+C
特に4番大事。これやるとペースト先で座標がずれません。え?知ってました? 私知らなかったです……。Windowsの方は適宜キーを読み替えてください。【追記終わり】


■新しいボードを作りペースト■

File->New->Boardで新しいbrdを作ります。回路schは不要です。

JLCPCBの場合、パネライズの最低サイズは70x70mmなのでこれ以上になるようにします。あまった部分に詰め込んでもいいですし、さくっとカットしてもいいです。

カーソルを原点に合わせてからcmd+Vでさっきコピーしたボード図をペーストし、正しい位置に置きます。同じものが複数必要ならば、正しい位置に必要な回数コピーします。saveします。複数の回路を組み込む場合は、パネライズとペーストを繰り返します。

基板の配置は、かならず碁盤の目のように縦横が並んでいないといけません。冒頭に書いたように、V-cutラインは端から端まで一直線に横切らないといけないからです。

■V-cutのラインを入れる■

アイコンからLineを選び、レイヤーとしてVscore、太さ0.5mmを指定します。太さは0でもいいですが、カットする幅が必要なのでカット幅がパターンやシルクをケズらないか確認する意味でも太さを指定した方が良いと思います。

端から端まで縦縦縦縦横横横……と線を入れていきます。なお、下の図で、下の方にやたらスキマが開いているのは、70x70mmというルールに後から気づいた(指摘された)からです……。 もともとの設計は60x50mmだったのですが、今回の基板、四隅の固定ネジの間隔は決まっているので、もったいないですが左右と下に余白を追加しました。なお、V-cutを依頼する場合、JLCPCBでは70x70mm、ALLPCBは80x80mmが最低外形寸法です。


■Gerber出力■

いつものCam processerを使ってGerberを出力しますが、いつもと違う点が2つ。processorによって違うかもしれないので、私がいつも使っているSystem Example -> Third Party -> OSH Park -> OSHPark_2_Layer.camを例に説明します。


まず、Gerber下のBoard Outlineには、Edit Layersのボタンから「Vscore」を追加します。これをしないとV-cut用に書いた線がgerberに出力されません。


Vscoreを追加すると、右の窓にgerber線が追加されます。


次に、Top Silkscreenでは、同様にEdit LayersボタンからもともとのtNamesを除外し、_tNamesを選びます。裏面にもシルクがある場合も同様にbNamesを除外して_bNamesを選びます。

あとは、Process Jobをクリックすれば、.zipが出来上がります。

■発注時の注意■

JLCPCBに注文を入力する際に、何種類のデザインが混在しているか、を忘れずに選びます。Different Designを2以上にすると自動的にDelivery Formatが「panel by Customer」に切り替わります。


あとは、いつものように発注しましょう。

あ、パネライズ初体験の場合は、チェックアウトの3.Submit Orderのところで「Review Before Payment」を選んだほうが良いと思います。私もやらかしてキャンセル→再注文になってしまいましたので……。

2020年7月15日水曜日

インターフォンからSMSを送りXiaomi mi bandへ通知



耳が聞こえないとインターフォンが聞こえないのでsmart bandに通知を送りたい。

ずっと考えていましたが、小雨降るお散歩中に簡単な方法を思いついたので、作ってみました。構想半年、アイデア30分、実装1時間、ブログ2時間ってやつです。

なお、タイトルは途中経過を大幅に端折ってます。

実際には
  1. 呼び鈴を押す
  2. インターフォンの画面が明るくなる
  3. APDS9930で明るさを検知
  4. ESP32でIFTTTを叩く
  5. IFTTTが私のiPhoneにSMSを送る
  6. iPhoneが着信
  7. Xiaomi mi bandに着信通知
という流れです。

■SMSは有償です■

ところでSMSの送信は有償です。今回使うclicksend.comだと1回約5円です。clicksend.comのアカウントを取得すると100円分のチャージが7日間使えます。実験であればそれで試せます。それでイケるとなったらカード番号など登録しましょう。

なんで自分ちのインターフォンが有償なんじゃい?!という気持ちがないではないですが、まぁ聴覚障害者として生まれちゃったのでしょうがないですね。

我が家の場合、比較的単価の安い荷物はみんな宅配ボックス、そうでない荷物や書留などについては電話で呼び出してもらってます。残りは生協ぐらいですが、生協は対面で受け取ると保冷ボックスが不要で手間がかからないというメリットがあって、それはまぁ5円に見合うのではないかと思っています。

■必要資材■


■IFTTTの設定■

アカウントのとり方などは他の方のブログを参考にしてください。以下の手順でIFTTTにサービスを追加します……「サービス」であってます?呼び方がわからん。
  1. ブラウザでHOME画面の右上、Createをクリック
  2. 「If」の後の「+」をクリック
  3. Search Servicesで「Webhook」と入力し「Webhooks」をクリック
    WebhooksはIFTTTの特定のURLを叩くと起動します。ESP32からのアクセスにうってつけですね。
  4. 「Receive a web request」をクリック
  5. 「Event Name」を入力します。今回は画面の明かりが点灯したことをトリガーにするので「light_up」と入力し、create triggerボタンをクリックします。
  6. If Thenのあとの「+」をクリック
  7. ClickSend SMSを選びます。
  8. 青い「Send SMS」をクリックします。
  9. Toにスマフォの電話番号を入力してCreate actionをクリックします。
  10. Finishをクリックします。
と、すみません。6-10のどこかでclicksend.comのアカウント取得画面に飛ぶのですが、スクショ取りそこねてしまいました。特に難しいことはないと思います。

ともあれ、これで特定のURLを叩くとSMSに通知が飛ぶ、というサービスができました。試すには
  1. ブラウザ上でIFTTTのHomeに戻る。
  2. Webhooksをクリック
  3. 右上のDocumentationをクリック
  4. 「Make a POST or GET web request to:」下の{event}にlight_upと入力
  5. value1, value2, value3には適当な文字列などを入れてみる。
    入力するとそれにつれてcurlのパラメータが変わっていきます。
  6. Test itのボタンをクリック
数秒後にさっきToで登録した電話番号にSMSが届きます。

ここでcurlの-d以降の部分をhttp postすれば中身がメッセージとして送られますが、 今回の用途ではSMSだけ送ればいいのでhttps以降だけを叩くのが簡単です。今回もそれで済ませてます。ごめんなさい。

■ハードウェアの接続■

私は以下のブログを参考にしました。ってわしのブログや。どんなつまらないことでもブログに残しておくべきだなぁとしみじみ思う今日このごろです。

CJMCU-9930ESP32
VL3.3v
GNDGND
VCC3.3v
SCL22
SDA21

ブログと異なり、INT - 2の配線は不要です。

■ESP32の実装■

APDS9930のサンプルプログラムを元に、http secureのサンプルを切り貼りしました。コピペエンジニアリングです。ごめんなさい。
//
//  WiFi Secure, IFTTT
//

#include <WiFiClientSecure.h>

#define ssid     "....ssid...."
#define password "....password...."

const char*  server = "maker.ifttt.com";  // Server URL

const char* test_root_ca = \
 "-----BEGIN CERTIFICATE-----\n" \
"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \
"DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" \
"SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" \
"GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" \
"AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" \
"q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" \
"SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" \
"Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" \
"a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" \
"/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" \
"AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" \
"CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" \
"bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" \
"c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" \
"VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" \
"ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" \
"MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" \
"Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" \
"AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" \
"uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" \
"wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" \
"X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" \
"PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" \
"KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" \
"-----END CERTIFICATE-----\n";

WiFiClientSecure client;

void submit() {
  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!");
    // Make a HTTP request:
    client.println("POST https://maker.ifttt.com/trigger/light_up/with/key/....api key.... HTTP/1.0");
    client.println("Host: maker.ifttt.com");
    client.println("Connection: close");
    client.println();

    while (client.connected()) {
      String line = client.readStringUntil('\n');
      if (line == "\r") {
        Serial.println("headers received");
        break;
      }
    }
    while (client.available()) {
      char c = client.read();
      Serial.write(c);
    }

    client.stop();
  }
}


//
//  APDS9930
//

#include <Wire.h>
#include <APDS9930.h>

// Global Variables
APDS9930 apds = APDS9930();
float ambient_light = 0; // can also be an unsigned long
uint16_t ch0 = 0;
uint16_t ch1 = 1;



//
//  setup
//

void setup() {
  // Initialize Serial port
  Serial.begin(115200);

  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  // attempt to connect to Wifi network:
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }

  Serial.print("Connected to ");
  Serial.println(ssid);

  // Initialize APDS-9930 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9930 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9930 init!"));
  }

  // Start running the APDS-9930 light sensor (no interrupts)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Light sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during light sensor init!"));
  }

  delay(500);
}


//
//  loop
//
uint32_t prevMillis = 0;

void loop() {

  // Read the light levels (ambient)
  if (  !apds.readAmbientLightLux(ambient_light)) {
    Serial.println(F("Error reading light values"));
  } else {
    Serial.print(F("Ambient: "));
    Serial.println(ambient_light);

    uint32_t thisMillis = millis();
    if ((prevMillis == 0 || thisMillis - prevMillis > 180 * 1000) && ambient_light > 50) {

      submit();

      prevMillis = thisMillis;
    }

    //    char fstr[16];
    //    dtostrf(ambient_light, 5, 1, fstr);
    //    M5.Lcd.drawString(fstr, 80,  70);
  }

  delay(100);
}