ケースは 6mm 厚の板材のため、スイッチ類をどうやって付けるか悩みました。結局、裏側にアクリル阪を付けて、そこに取り付けました。電源スイッチは木の厚みがあって、シーソーやトグルは付けられないためロータリースイッチにしています。
薄く切ったイチゴはペラペラに乾きました。厚みがあるのはまだ水気があります。あまり薄いのは食べた気がしないので、ちょっと厚めに切って、2日間乾かすのが良さそうでした。ローズマリーはかなり茶色っぽくなってしまいました。熱のせいかな?
今回は回転台の実装方法を考えるのと木工の工作が思ったより大変でしたが、動作も期待通りで楽しく作れました。何と言っても実用的です。晴れの予報の日は何かしら干したくなります(笑)。すべて段ボールでも作れると思うので中高生の夏休みの工作にちょうどいいかも知れません。
#include <Servo.h>
#define BUTTON_PIN 2 //位置設定ボタン
#define SERVO_PIN 3 //サーボ制御 ex.9
#define DEBUG_LOG 0 //Serial output control
#include <Bounce2.h>
Bounce2::Button button = Bounce2::Button();
Servo myservo; // create servo object to control a servo
const int vrPin = A2; //位置設定VR
const int sensPin1 = A3; // CDS1 input ex.A0
const int sensPin2 = A4; // CDS2 input ex.A1
const int maxArr = 5; //移動平均配列サイズ
int sensVal1[maxArr], sensVal2[maxArr];
int currentDeg=1500; //サーボ初期値 中央 South
uint8_t u8state=0;
unsigned long u32wait;
const long intervalS=100;
const long intervalL=5000;//3000;
long intervalMillis=intervalS; //interval to execute
int delta; //delta of 2 CDS
const int deltaThreshold=20; //in-focuse if wihtin deltaThreshold
int totalSensVal1, totalSensVal2;
//int ledPin = LED_BUILTIN;
void initcode() {//init servo position;
myservo.attach(SERVO_PIN, 500, 2500); //limit within 180 deg
button.attach( BUTTON_PIN, INPUT_PULLUP );
button.interval(5);
button.setPressedState(LOW);
for (int i=0;i<maxArr;i++) {
sensVal1[i]=sensVal2[i]=0;
}
myservo.write(currentDeg);
delay(1000);
//pinMode(ledPin, OUTPUT);
//digitalWrite(ledPin, LOW);
}
void moveToVR() {
int vrValue=analogRead(vrPin);
int deg = map(vrValue, 0, 1023, 500, 2500);
int i;
if (currentDeg>deg) {
for (i=currentDeg;i>deg;i--) {
myservo.write(i);
delay(5);
}
} else
if (currentDeg<deg) {
for (int i=currentDeg;i<deg;i++) {
myservo.write(i);
delay(5);
}
}
currentDeg=i;
}
void setup() {
//Initialize serial and wait for port to open:
if (DEBUG_LOG) {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
}
initcode();
u32wait = millis() + intervalMillis;
//digitalWrite(ledPin, HIGH);
}
void loop() {
button.update();
switch( u8state ) {
case 0:
if ( button.pressed() ) {
moveToVR();
}
if ( millis() > u32wait ) u8state++; // wait state
break;
case 1:
if (arrPos>=maxArr) arrPos=0; //arrPos>9
sensVal1[arrPos] = analogRead(sensPin1);
sensVal2[arrPos] = analogRead(sensPin2);
arrPos++;
//注意!! switch 文の case 部に変数宣言と初期化があると、エラーは出ないが正常に動作しない。
//int totalSensVal1=0, totalSensVal2=0;
totalSensVal1=0, totalSensVal2=0;
for (int i=0;i<maxArr;i++) { //i<10
totalSensVal1=totalSensVal1+sensVal1[i];
totalSensVal2=totalSensVal2+sensVal2[i];
}
delta=totalSensVal2-totalSensVal1;
u8state++;
break;
case 2:
boolean update=false;
if *1&&(currentDeg<2500)) {
currentDeg++;
intervalMillis=intervalS;
update=true;
} else
currentDeg--;
intervalMillis=intervalS;
update=true;
} else
currentDeg++;
intervalMillis=intervalL;
update=true;
} else
currentDeg--;
intervalMillis=intervalL;
update=true;
}
if (update) {
myservo.write(currentDeg);
if (DEBUG_LOG) {
Serial.print("SensVal1=");Serial.print(totalSensVal1);
Serial.print("\t");
Serial.print("SensVal2=");Serial.print(totalSensVal2);
Serial.print("\t");
Serial.print("delta=");Serial.print(delta);
Serial.print("\t");
Serial.print("interval=");Serial.print(intervalMillis);
Serial.print("\t");
Serial.print("deg=");Serial.print(currentDeg);
Serial.println("\t");
}
}
u32wait = millis() + intervalMillis;
u8state = 0;
break;
} //end switch()
}