2020年11月28日 星期六

PHYduino帶著走的實驗室VR3 for 夢N屏東



請按照圖案(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)順序安裝,安裝完(1)(2)(3)先測試螢幕與按鈕是否可作動,後續(4)(5)(6)(7)(8)(9)(10)部分依序安裝便可以依序測試各功能是否可用
按鈕長按超過1秒為更換功能
按鈕短按小於0.8秒為更換模式
旋鈕為調整延遲時間或是調整光亮度與音調所使用

很抱歉,這次廠商出貨有點問題,3色LED大家拿到的是3色共陽,但是請大家自行取得 3色LED 共陰,再按照圖片裝上去即可

另外下圖是這次我大量購買的材料費,請大家參考品名跟價錢



功能依序有:
功能0-溫溼度檢測
    模式1全顯示:顯示2個DHT11溫溼度檢測器+2個防水溫度檢測器
    模式2單一溫度變化:顯示1個DHT11+1個防水溫度計,並於右方進行6組溫度數據紀錄
    模式3兩濕度變化:顯示2個DHT11溼度檢測數值,並記錄4組濕度數據
    模式4兩溫度變化:顯示2個防水溫度計檢測數值,並記錄4組溫度數據
功能1-RGB混色
    模式R:調整紅色亮度
    模式G:調整綠色亮度
    模式B:調整藍色亮度
    旋鈕:調整亮度數值0-255
功能2-聲音產生器
    模式1:31-1000Hz
    模式2:31-10000Hz
    旋鈕:調整音調數值31-(無源蜂鳴器最低31Hz)
功能3-距離測量
    模式1:超快速距離測量(時間不準確),並於右方進行6組溫度數據紀錄
    模式2:距離測量
    旋鈕:調整測量延遲時間
功能4-馬達轉動:5度-180度
功能5-光敏電阻分光光度計,將三色單顆的LED對準光敏電阻,就可以觀查了
    模式W:白光
    模式R:紅光
    模式G:綠光
    模式B:藍光
功能6-顯示名稱

以下是本次的arduino程式

/*
 * PHYduinoVR320201129
 * design by orangeV,taiwan,tainan 台南大成國中 蔡智恆
 * need libraries 需要程式庫<Servo.h>,<DHT.h>,<SPI.h>,<Wire.h>,<Adafruit_GFX.h>,<Adafruit_SSD1306.h>,<OneWire.h>,<DallasTemperature.h>
 * Acknowledgments: 龍山國中 鄭志鵬、Proman Huang
 */

int
//對應腳位
//0
//1
//2中斷能力腳位,光閘2
//3~PWM中斷能力腳位
motorPin = 4,     //4步進馬達
ledRPin = 5,      //5~PWM紅LED
ledGPin = 6,      //6~PWM綠LED
cR = 0, cG = 0, cB = 0,
ds18b20 = 7,      //7溫度計ds18b20
//8光閘1
buzzer = 9,       //9,蜂鳴器 (蜂鳴器可以讓出來)
button = 10,       //10,按鈕
ledBPin = 11,     //11~PWM藍LED
trigPin = 12,     //12超聲波測距Trig Pin
echoPin = 13,     //13超聲波測距Echo Pin
Photo = A0,       //A0光敏電阻
DHTPin = 15,      //A1溫濕度DHT
DHT2Pin = 16,     //A2溫濕度DHT2
potPin = 17,      //A3可變電阻旋鈕
//A4
//A5
//A6
//A7
//常數
R = 0,
menu1N = 5,
menu2N = 7,
delaytime = 0;

float cm = 0.0, cm0[9] = {0}, cm1[9];
int i=0 , j;



//motor
#include <Servo.h>
Servo myservo;


//DHT11/22
#include <DHT.h>
DHT dht(DHTPin, DHT11);
DHT dht2(DHT2Pin, DHT11);


//D18B20
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(ds18b20);
DallasTemperature sensors(&oneWire);

              

//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
//OLEDsetting
#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

const unsigned char PHYduino_Logo [] PROGMEM = {
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6,
0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6,
0x66, 0xff, 0xfc, 0xff, 0xfc, 0xe0, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x66,
0x66, 0x00, 0x14, 0xa0, 0x14, 0xa0, 0x68, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x66,
0x66, 0xfc, 0x0c, 0xc0, 0x0c, 0xc0, 0x98, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x66,
0x66, 0x0c, 0x0c, 0xc0, 0x00, 0x83, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa6,
0x66, 0x0c, 0x0c, 0xc0, 0x00, 0x8c, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xe6,
0x66, 0x0c, 0x1c, 0xe0, 0x00, 0xd0, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x06,
0x66, 0xf7, 0xf4, 0xa0, 0x1c, 0xa0, 0x39, 0xff, 0xf7, 0x80, 0x7f, 0xc3, 0xf3, 0x06, 0x00, 0xe6,
0x66, 0xac, 0x18, 0xff, 0xf4, 0xff, 0xe9, 0x40, 0x1e, 0x80, 0x51, 0x42, 0xd3, 0x05, 0xff, 0xa6,
0x66, 0xcc, 0x00, 0x00, 0x0c, 0x00, 0x39, 0x80, 0x19, 0x80, 0xf1, 0xf3, 0x33, 0x06, 0x00, 0x66,
0x66, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x19, 0x80, 0x19, 0x83, 0x31, 0x98, 0x33, 0x06, 0x00, 0x66,
0x66, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x19, 0x80, 0x19, 0x8c, 0x31, 0x8e, 0x33, 0x06, 0x00, 0x66,
0x66, 0x0e, 0x00, 0x00, 0x0c, 0x00, 0x39, 0xc0, 0x39, 0xb0, 0x31, 0x83, 0xb3, 0x92, 0x00, 0x66,
0x66, 0x0a, 0x00, 0x00, 0x14, 0x00, 0x29, 0x40, 0x29, 0x40, 0x51, 0x40, 0xd2, 0xad, 0xff, 0xa6,
0x67, 0x0f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf9, 0xc0, 0x73, 0xc6, 0x00, 0xe6,
0x65, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x66,
0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//menu
int mode1=1, mode2=0;

void setup() {
  Serial.begin(9600);

  //buzzer
  pinMode(buzzer,OUTPUT);

  //soundsonic
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  Wire.begin();
  dht.begin();
  dht2.begin();
 
  //motor
  myservo.attach(motorPin);

  //Photoresistor
  pinMode(Photo, INPUT);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  display.clearDisplay();
  display.drawBitmap(0, 8, PHYduino_Logo, 128, 64, WHITE);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  display.print("orangeV  TCJHS.lab V3");
  display.display();
  delay(1500);
  display.clearDisplay();
}

void loop() {
  int sw = digitalRead(button);
  R = analogRead(potPin);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  if(sw == HIGH)menu();
  if(mode2 == 0)DHTxx();
  if(mode2 == 1)RGBLED();
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) noTone(buzzer);
  if(mode2 == 3)supersonic();
  if(mode2 == 4)motor();
    if ( mode2 != 4 ) myservo.write(0);
  if(mode2 == 6)openmenu();
  if(mode2 == 5)Photoresistor();
  if(mode2 != 1 && mode2 != 5 ){
    analogWrite(ledRPin, 0);//調弱輸出電壓,保護LED燈跟眼睛
    analogWrite(ledGPin, 0);
    analogWrite(ledBPin, 0);
  }
}

void menu(){
  int k0,k1,tt=0;
  AA1: k0=digitalRead(button);  delay(30);
  k1 = digitalRead(button);
  if (k1==LOW) goto AA1;  //判断按键是否低电平,如果低,循环检测,如果高则下一句
  AA2: tt++;             //对按键高电平计数
  k0 = digitalRead(button);  delay(10);
  k1 = digitalRead(button);
  if (k1==HIGH) goto AA2;  //判断按键是否高电平,如果高,继续计数,如果低电平,则表示按键结束
  if (tt<80)   mode1 = mode1 + 1;         //如果按键时间小于80*10ms=0.8s
  if (tt>100)  mode2 = mode2 + 1;         //如果按键时间大于100*10ms=1s
  if ( mode2 == menu2N ) mode2 = 0;
  if ( mode1 == menu1N ) mode1 = 1;
}

void Buzzer(){
  R = analogRead(potPin);
  int R1=0,R10=0;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("Sound");
  display.setCursor(40,0);
  if (mode1==1){
    display.println(" 31 ~ 1000 HZ");
  }else{
    display.println(" 31 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<31){
    noTone(buzzer);
    display.print(0);
  }else{
    if(mode1==1){
    R1 = R - 10;
    tone(buzzer,R1);
    display.print(R1);
    }else if(mode1==2){
    R10 = R*10-100;
    tone(buzzer,R10);
    display.print(R10);
    }
  }
  display.setCursor(60,12);
  display.println("Hz");
  display.display();
  display.clearDisplay();
  delay(100);
}

void supersonic(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float duration = pulseIn (echoPin, HIGH),
      cm = (duration) / 58.2
  ;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("SoundSonic 2to60");
  display.setCursor(100,0);
  display.print("mod");
  display.println(mode1);
  display.setTextSize(1);
  display.print("t= ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  if(mode1==2) delaytime = delaytime/10;
  display.print(delaytime);
  if(mode1==1) delaytime = delaytime - 90;
  if(mode1==2) delaytime = delaytime - 10;
  display.setCursor(44,8);
  display.println("ms");
  int cm10=cm*10;
  display.setTextSize(2);
  if (cm<60&&cm>2){
    display.print(cm10/10);
    display.setTextSize(1);
    display.setCursor(25,23);
    display.print(".");
    int cm100=cm*100;
    display.print(cm100%100/10);
  }else{
    display.print("err");
  }
  display.setTextSize(2);
  display.setCursor(37,16);
  display.println("CM");

  display.display();
  display.clearDisplay();

  if(mode1==1||mode1==2){
    Serial.print(cm);
    Serial.print("CM");
    Serial.print(delaytime);
    Serial.println("ms");
    if(i>=9)i=0;
    if(i<9){
      if (cm<60&&cm>3){
        cm0[i]=cm;
      }else{
        cm0[i]=0;
      }
      display.setTextSize(1);
      display.setCursor(70+20*(i%3),(i/3)*7+10);
      display.print("*");
      display.setCursor(75,10);
      display.print(cm0[0],0);
      display.setCursor(95,10);
      display.print(cm0[1],0);
      display.setCursor(115,10);
      display.print(cm0[2],0);
      display.setCursor(75,16);
      display.print(cm0[3],0);
      display.setCursor(95,16);
      display.print(cm0[4],0);
      display.setCursor(115,16);
      display.print(cm0[5],0);
      display.setCursor(75,23);
      display.print(cm0[6],0);
      display.setCursor(95,23);
      display.print(cm0[7],0);
      display.setCursor(115,23);
      display.print(cm0[8],0);
      i++;
    }
  }
  delay(delaytime);
}

void DHTxx() {
  sensors.requestTemperatures();
  float DHThum = dht.readHumidity();
  float DHTtemp = dht.readTemperature();
  float cc = sensors.getTempCByIndex(0);
  float cc1 = sensors.getTempCByIndex(1);
  float DHT2hum = dht2.readHumidity();
  float DHT2temp = dht2.readTemperature();
 
  display.print("T & H ");
  display.print("t = ");
  
  R = map(R, 0, 1020, 1,10 );  // 0-1024 -> 1-10
  delaytime = R*500-400;
  display.print(delaytime+900);
  display.print(" ms");

  if ( mode1 >= 5 ) mode1 = 1;
  display.print(" m");
  display.println(mode1);



  if (mode1 == 2) {
    display.print(DHThum, 0); //小數點0位
    display.print("% ");
    display.print(DHTtemp, 1); //小數點1位
    display.println("C");
    display.setTextSize(2);
    if (cc > -127) {
      display.print(cc, 1);
    }
    display.print("C");
    if (i >= 6)i = 0;
    if (i < 6) {
      if (cc > -170) {
        cm0[i] = cc;
      } else {
        cm0[i] = 0;
      }
      display.setTextSize(1);
      display.setCursor(60 + 30 * (i % 2), (i / 2) * 6 + 10);
      display.print("*");
      display.setCursor(65, 10);
      display.print(cm0[0], 1);
      display.setCursor(95, 10);
      display.print(cm0[1], 1);
      display.setCursor(65, 16);
      display.print(cm0[2], 1);
      display.setCursor(95, 16);
      display.print(cm0[3], 1);
      display.setCursor(65, 22);
      display.print(cm0[4], 1);
      display.setCursor(95, 22);
      display.print(cm0[5], 1);
      i++;
    }
  }
  if (mode1 == 1) {
    display.print("DHT1= ");
    display.print(DHThum, 0); //小數點0位
    display.print("% ");
    display.print(DHTtemp, 1); //小數點1位
    display.println("C");
    display.print("DHT2= ");
    display.print(DHT2hum, 0); //小數點0位
    display.print("% ");
    display.print(DHT2temp, 1); //小數點1位
    display.println("C");
    
    display.print("T1= ");
    if (cc > -127) {
      display.print(cc, 1);
    }
    display.print("C ");
    display.print("T2= ");
    if (cc1 > -127) {
      display.print(cc1, 1);
    }
    display.println("C");
  }
  if (mode1 == 3) {
    if (i < 5) {
      if (DHThum >= 0) {
        cm0[i] = DHThum;
      } else {
        cm0[i] = 0;
      }
      if (i < 5) {
        if (DHT2hum >= 0) {
          cm1[i] = DHT2hum;
        } else {
          cm1[i] = 0;
        }
        if (i >= 4)i = 0;
        display.setTextSize(1);
        display.setCursor(5, 10);
        display.print(" H1   H2");
        display.setCursor(65, 10);
        display.print(" H1   H2");
        display.setCursor(60* (i % 2), (i / 2) * 4 + 18);
        display.print("*");
        display.setCursor(8, 16);
        display.print(cm0[1], 0);
        display.print("%  ");
        display.print(cm1[1], 0);
        display.print("%");
        display.setCursor(68, 16);
        display.print(cm0[2], 0);
        display.print("%  ");
        display.print(cm1[2], 0);
        display.print("%");
        display.setCursor(8, 22);
        display.print(cm0[3], 0);
        display.print("%  ");
        display.print(cm1[3], 0);
        display.print("%");
        display.setCursor(68, 22);
        display.print(cm0[4], 0);
        display.print("%  ");
        display.print(cm1[4], 0);
        display.print("%");
      }
    }
    i++;
  }
  if (mode1 == 4) {
    if (i < 5) {
      if (cc > -170) {
        cm0[i] = cc;
      } else {
        cm0[i] = 0;
      }
      if (i < 5) {
        if (cc1 > -170) {
          cm1[i] = cc1;
        } else {
          cm1[i] = 0;
        }
        if (i >= 4)i = 0;
        display.setTextSize(1);
        display.setCursor(5, 10);
        display.print(" T1   T2");
        display.setCursor(65, 10);
        display.print(" T1   T2");
        display.setCursor(60* (i % 2), (i / 2) * 4 + 18);
        display.print("*");
        display.setCursor(8, 16);
        display.print(cm0[1], 0);
        display.print("c  ");
        display.print(cm1[1], 0);
        display.print("c");
        display.setCursor(68, 16);
        display.print(cm0[2], 0);
        display.print("c  ");
        display.print(cm1[2], 0);
        display.print("c");
        display.setCursor(8, 22);
        display.print(cm0[3], 0);
        display.print("c  ");
        display.print(cm1[3], 0);
        display.print("c");
        display.setCursor(68, 22);
        display.print(cm0[4], 0);
        display.print("c  ");
        display.print(cm1[4], 0);
        display.print("c");
      }
    }
    i++;
  }
  display.display();
  display.clearDisplay();
  delay(delaytime);
  delaytime = 0;
}

void motor(){
  R = 0;
  R = analogRead(potPin);
  R = map(R, 0, 1023, 0, 175);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor 5 ~ 180");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R+5);
  delay(15);
  display.display();
  display.clearDisplay();
}
void RGBLED(){
  R = 0;
  if ( mode1 >= 4 ) mode1 = 1;
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 255);  // 0-1024 -> 0-255
  display.print("RGB LED");
  if(mode1==1){
    display.println("   R");
    cR=R;
  }else if(mode1==2){
    display.println("   G");
    cG=R;
  }else if(mode1==3){
    display.println("   B");
    cB=R;
  }else{
    display.println("   clear");
    cR=0;
    cG=0;
    cB=0;
  }
  display.print("R=");
  display.println(cR);
  display.print("G=");
  display.println(cG);
  display.print("B=");
  display.println(cB);
  display.display();
  display.clearDisplay();
  analogWrite(ledRPin, cR*0.8);//調弱輸出電壓,保護LED燈跟眼睛
  analogWrite(ledGPin, cG*0.8);
  analogWrite(ledBPin, cB*0.8);
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV  TCJHS.lab V3");
  display.drawBitmap(0, 8, PHYduino_Logo, 128, 64, WHITE);
  display.display();
  display.clearDisplay();
  R = 0;
  mode1 = 1;
}

void Photoresistor(){
  int pr = analogRead(Photo);
  int cR = 0, cG = 0, cB = 0;
  if ( mode1 >= 5 ) mode1 = 1;
  display.print("Photo");
  if(mode1==1){
    display.println("   W");
    cR=200;
    cG=200;
    cB=200;
  }else if(mode1==2){
    display.println("   R");
    cR=200;
  }else if(mode1==3){
    display.println("   G");
    cG=200;
  }else if(mode1==4){
    display.println("   B");
    cB=200;
  }else{
    display.println("   clear");
    cR=0;
    cG=0;
    cB=0;
  }
  Serial.println(pr);
  display.setTextSize(2);
  display.print("Light ");
  display.print(pr);
  delay(15);
  display.display();
  display.clearDisplay();
  analogWrite(ledRPin, cR);//調弱輸出電壓,保護LED燈跟眼睛
  analogWrite(ledGPin, cG);
  analogWrite(ledBPin, cB);
}

2020年9月24日 星期四

科學探究第一課-紫洋蔥表皮細胞滲透作用

結合之前研發的-探究教學教案模板+手機顯微鏡兩個利器,就可以進行這個課程了
課程進行時間:完成不同細胞有不同功能課程,運用課本觀察圖片,了解動植物細胞差異後

整個學習單學習完成+滲透課程+科學方法需要4堂課

重要觀點:
上課過程所有答案均是讓(部分)學生提出,除了最上方目標外,老師只能引導不說出任何答案
寫講義的過程中不用講述三種變因,操作組與實驗組概念,先做了最後第4節再回來教授科學方法即可

需要材料:
2人一組
1元手機顯微鏡*1、塑膠培養皿*1、紫洋蔥*7小片、鹽、眼藥瓶*3、平板*1、美工刀or小刀*1

講義如下

第一堂課
教學目標:
完成講義目標與Po觀察訂題處+學習手機顯微鏡操作

運用食鹽放在舌頭上的引導課程,讓學生體驗食鹽會造成舌頭細胞疼痛感,進而思考舌頭細胞發生的變化

讓學生回答出舌頭可能在脫水,而且不是馬上就脫水,要鹽先接觸口水溶化後才會有感覺

運用手機顯微鏡觀察:
1.鹽巴,可以看到鹽的結晶
2.鹽巴+紫洋蔥,把洋蔥放到鹽上方,可以看到一格一格的細胞,了解生物由細胞組成,且植物細胞具有細胞壁
觀察一陣子發現不太會有反應
3.鹽巴+紫洋蔥+水,滴一兩滴水上去,觀察細胞差異
了解紫洋蔥表皮細胞會因為鹽水脫水,鹽融化才會開始反應,而且在切割受傷處才會脫水,連結-在傷口撒鹽


第二堂課
教學目標:
完成Pe計畫執行與實驗操作,說出操作變因要選擇什麼,應變變因要記錄什麼(這裡都沒帶出3變因名字,只是問:要改變什麼不同來實驗,要記錄什麼),並實際進行實驗
準備3個空杯子,分別倒入50cc鹽、25cc鹽、空杯子
請學生依據上一堂課進行實驗設計,
回答出
1.用不同濃度鹽水進行實驗
2.要記錄細胞的變化與時間
3.可以用平板拍攝來記錄時間

老師告知要如何製造洋蔥表皮傷口-順著洋蔥表皮的溝槽與紋路方向[縱切]、[橫切],讓學生選擇比較適當的[縱切]作為觀察

並運用3個眼藥瓶吸取濃鹽水、稀鹽水、清水進行實驗操作觀察

學生看到的影像如下


第三節課
教學目標:學習方格紙繪圖技巧+Pa運用數據分析發現+Pe適當的討論傳達

運用小畫家確實地在一樣的形狀講義上修改與教學,減少學生認知誤差

上一節的學生實驗數據只是參考,大致統整一個數據填入[平均]這一格,統一數據比較好教畫圖
指導
1.XY座標數值選擇
2.Y座標數值要怎麼填,從多少開始,間距是多少
3.數值省略符號
4.長條圖(柱狀圖)與折線圖差異

第四節課
課本科學方法,帶入名詞,運用上述課程結合科學方法的名詞



學生的作業狀況



同校老師的觀課回饋(看第2節實驗操作部分)


這樣就可以完成一次完整的探究過程,並且讓學生更快速正確學習科學方法了。




2020年9月8日 星期二

PHYduinoV3.1 20200910物理實驗組:溫濕度+光學混光+音頻調整+超音波測距+馬達角度控制+光敏電阻測光穿透

20200909研習後修正
請依(1)~(10)依序安裝,安裝(3)~(10)的每一個功能皆需進行功能測試後才能安裝下一功能

功能請參考https://orangevblog.blogspot.com/2019/10/arduinodht11.html


這個版本跟上一個版本差異是

1.新增光敏電阻,可以作為光度計使用,偵測光的穿透率

2.部分腳位移動規劃,有些直接插在擴充版上,不經過麵包版

3.增加開機顯示畫面

4.增加一個溫濕度計,修改該畫面呈現

5.去掉某些不太需要的數值呈現畫面


預計未來要更新的有

0.修改溫濕度計部分之顯示方式,呈現雙溫度計、雙溼度計等不同選擇

1.增加磁場感測能力

2.增加靜電場感測能力

3.增加光閘以更精準測定移動中的物體

4.連結電腦可以上傳數據

5.修改圖像化表現方式

6.超音波測距儀的顯示準度


程式碼

/*


 * design by orangeV,taiwan,tainan 台南大成國中 蔡智恆


 * need libraries 需要程式庫<Servo.h>,<DHT.h>,<SPI.h>,<Wire.h>,<Adafruit_GFX.h>,<Adafruit_SSD1306.h>,<OneWire.h>,<DallasTemperature.h>


 * Acknowledgments: 龍山國中 鄭志鵬、Proman Huang


 */




int


//對應腳位


//0


//1


//2中斷能力腳位,光閘2


//3~PWM中斷能力腳位


motorPin = 4,     //4步進馬達


ledRPin = 5,      //5~PWM紅LED


ledGPin = 6,      //6~PWM綠LED


cR=0,cG=0,cB=0,


ds18b20 = 7,      //7溫度計ds18b20


//8光閘1


buzzer = 9,       //9,蜂鳴器 (蜂鳴器可以讓出來)


button = 10,       //10,按鈕


ledBPin = 11,     //11~PWM藍LED


trigPin = 12,     //12超聲波測距Trig Pin


echoPin = 13,     //13超聲波測距Echo Pin


Photo = A0,       //A0光敏電阻


DHTPin = 15,      //A1溫濕度DHT


DHT2Pin = 16,     //A2溫濕度DHT2


potPin = 17,      //A3可變電阻旋鈕


//A4


//A5


//A6


//A7


//常數


R = 0,


menu1N = 5,


menu2N = 7,


delaytime = 100;




float cm = 0.0, cm0[9] = {0}, cm1[9];


int i=0 , j;








//motor


#include <Servo.h>


Servo myservo;






//DHT11/22


#include <DHT.h>


DHT dht(DHTPin, DHT11);


DHT dht2(DHT2Pin, DHT11);






//D18B20


#include <OneWire.h>


#include <DallasTemperature.h>


OneWire oneWire(ds18b20);


DallasTemperature sensors(&oneWire);




              




//OLED


#include <SPI.h>


#include <Wire.h>


#include <Adafruit_GFX.h>


#include <Adafruit_SSD1306.h>


#define OLED_RESET -1


Adafruit_SSD1306 display(OLED_RESET);


//OLEDsetting


#define LOGO16_GLCD_HEIGHT 32


#define LOGO16_GLCD_WIDTH  16


#if (SSD1306_LCDHEIGHT != 32)


#error("Height incorrect, please fix Adafruit_SSD1306.h!");


#endif




const unsigned char PHYduino_Logo [] PROGMEM = {


0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,


0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,


0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,


0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6,


0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6,


0x66, 0xff, 0xfc, 0xff, 0xfc, 0xe0, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x66,


0x66, 0x00, 0x14, 0xa0, 0x14, 0xa0, 0x68, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x66,


0x66, 0xfc, 0x0c, 0xc0, 0x0c, 0xc0, 0x98, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x66,


0x66, 0x0c, 0x0c, 0xc0, 0x00, 0x83, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa6,


0x66, 0x0c, 0x0c, 0xc0, 0x00, 0x8c, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xe6,


0x66, 0x0c, 0x1c, 0xe0, 0x00, 0xd0, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x06,


0x66, 0xf7, 0xf4, 0xa0, 0x1c, 0xa0, 0x39, 0xff, 0xf7, 0x80, 0x7f, 0xc3, 0xf3, 0x06, 0x00, 0xe6,


0x66, 0xac, 0x18, 0xff, 0xf4, 0xff, 0xe9, 0x40, 0x1e, 0x80, 0x51, 0x42, 0xd3, 0x05, 0xff, 0xa6,


0x66, 0xcc, 0x00, 0x00, 0x0c, 0x00, 0x39, 0x80, 0x19, 0x80, 0xf1, 0xf3, 0x33, 0x06, 0x00, 0x66,


0x66, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x19, 0x80, 0x19, 0x83, 0x31, 0x98, 0x33, 0x06, 0x00, 0x66,


0x66, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x19, 0x80, 0x19, 0x8c, 0x31, 0x8e, 0x33, 0x06, 0x00, 0x66,


0x66, 0x0e, 0x00, 0x00, 0x0c, 0x00, 0x39, 0xc0, 0x39, 0xb0, 0x31, 0x83, 0xb3, 0x92, 0x00, 0x66,


0x66, 0x0a, 0x00, 0x00, 0x14, 0x00, 0x29, 0x40, 0x29, 0x40, 0x51, 0x40, 0xd2, 0xad, 0xff, 0xa6,


0x67, 0x0f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf9, 0xc0, 0x73, 0xc6, 0x00, 0xe6,


0x65, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x66,


0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,


0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,


0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,


0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,


0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00


};




//menu


int mode1=1, mode2=0;




void setup() {


  Serial.begin(9600);




  //buzzer


  pinMode(buzzer,OUTPUT);




  //soundsonic


  pinMode(trigPin, OUTPUT);


  pinMode(echoPin, INPUT);




  //ds18b20


  sensors.begin();




  //button


  pinMode(button, INPUT_PULLUP);




  //DHT


  Wire.begin();


  dht.begin();


  dht2.begin();


 


  //motor


  myservo.attach(motorPin);




  //Photoresistor


  pinMode(Photo, INPUT);




  //OLED


  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);


  display.display();


  display.clearDisplay();


  display.drawBitmap(0, 8, PHYduino_Logo, 128, 64, WHITE);


  display.setTextColor(WHITE);


  display.setCursor(0,0);


  display.setTextSize(1);


  display.print("orangeV  TCJHS.lab V3");


  display.display();


  delay(1500);


  display.clearDisplay();


}




void loop() {


  int sw = digitalRead(button);


  R = analogRead(potPin);


  display.setTextColor(WHITE);


  display.setCursor(0,0);


  display.setTextSize(1);


  if(sw == HIGH)menu();


  if(mode2 == 0)DHTxx();


  if(mode2 == 1)RGBLED();


  if(mode2 == 2)Buzzer();


    if ( mode2 != 2 ) noTone(buzzer);


  if(mode2 == 3)supersonic();


  if(mode2 == 4)motor();


    if ( mode2 != 4 ) myservo.write(0);


  if(mode2 == 6)openmenu();


  if(mode2 == 5)Photoresistor();


  if(mode2 != 1 && mode2 != 5 ){


    analogWrite(ledRPin, 0);//調弱輸出電壓,保護LED燈跟眼睛


    analogWrite(ledGPin, 0);


    analogWrite(ledBPin, 0);


  }


}




void menu(){


  int k0,k1,tt=0;


  AA1: k0=digitalRead(button);  delay(30);


  k1 = digitalRead(button);


  if (k1==LOW) goto AA1;  //判断按键是否低电平,如果低,循环检测,如果高则下一句


  AA2: tt++;             //对按键高电平计数


  k0 = digitalRead(button);  delay(10);


  k1 = digitalRead(button);


  if (k1==HIGH) goto AA2;  //判断按键是否高电平,如果高,继续计数,如果低电平,则表示按键结束


  if (tt<30)   mode1 = mode1 + 1;         //如果按键时间小于30*10ms=0.3s


  if (tt>80)  mode2 = mode2 + 1;         //如果按键时间大于80*10ms=0.8s


  if ( mode2 == menu2N ) mode2 = 0;


  if ( mode1 == menu1N ) mode1 = 1;


}




void Buzzer(){


  R = analogRead(potPin);


  int R1=0,R10=0;


  if ( mode1 >= 3 ) mode1 = 1;


  display.print("Sound");


  display.setCursor(40,0);


  if (mode1==1){


    display.println(" 31 ~ 1000 HZ");


  }else{


    display.println(" 31 ~ 10000 HZ");


  }


  display.setTextSize(2);


  if(R<31){


    noTone(buzzer);


    display.print(0);


  }else{


    if(mode1==1){


    R1 = R - 10;


    tone(buzzer,R1);


    display.print(R1);


    }else if(mode1==2){


    R10 = R*10-100;


    tone(buzzer,R10);


    display.print(R10);


    }


  }


  display.setCursor(60,12);


  display.println("Hz");


  display.display();


  display.clearDisplay();


  delay(100);


}




void supersonic(){


  digitalWrite(trigPin, LOW);


  delayMicroseconds(5);


  digitalWrite(trigPin, HIGH);


  delayMicroseconds(10);


  digitalWrite(trigPin, LOW);


  float duration = pulseIn (echoPin, HIGH),


      cm = (duration) / 58.2


  ;


  if ( mode1 >= 3 ) mode1 = 1;


  display.print("SoundSonic 2to60");


  display.setCursor(100,0);


  display.print("mod");


  display.println(mode1);


  display.setTextSize(1);


  display.print("t= ");


  R = analogRead(potPin);


  delaytime = R/100 * 100+100;


  if(mode1==2) delaytime = delaytime/10;


  display.print(delaytime);


  if(mode1==1) delaytime = delaytime - 90;


  if(mode1==2) delaytime = delaytime - 10;


  display.setCursor(44,8);


  display.println("ms");


  int cm10=cm*10;


  display.setTextSize(2);


  if (cm<60&&cm>2){


    display.print(cm10/10);


    display.setTextSize(1);


    display.setCursor(25,23);


    display.print(".");


    int cm100=cm*100;


    display.print(cm100%100/10);


  }else{


    display.print("err");


  }


  display.setTextSize(2);


  display.setCursor(37,16);


  display.println("CM");




  display.display();


  display.clearDisplay();




  if(mode1==1||mode1==2){


    Serial.print(cm);


    Serial.print("CM");


    Serial.print(delaytime);


    Serial.println("ms");


    if(i>=9)i=0;


    if(i<9){


      if (cm<60&&cm>3){


        cm0[i]=cm;


      }else{


        cm0[i]=0;


      }


      display.setTextSize(1);


      display.setCursor(70+20*(i%3),(i/3)*7+10);


      display.print("*");


      display.setCursor(75,10);


      display.print(cm0[0],0);


      display.setCursor(95,10);


      display.print(cm0[1],0);


      display.setCursor(115,10);


      display.print(cm0[2],0);


      display.setCursor(75,16);


      display.print(cm0[3],0);


      display.setCursor(95,16);


      display.print(cm0[4],0);


      display.setCursor(115,16);


      display.print(cm0[5],0);


      display.setCursor(75,23);


      display.print(cm0[6],0);


      display.setCursor(95,23);


      display.print(cm0[7],0);


      display.setCursor(115,23);


      display.print(cm0[8],0);


      i++;


    }


  }


  delay(delaytime);


}




void DHTxx() {


  sensors.requestTemperatures();


  float DHThum = dht.readHumidity();


  float DHTtemp = dht.readTemperature();


  float cc = sensors.getTempCByIndex(0);


  float cc1 = sensors.getTempCByIndex(1);


  float DHT2hum = dht2.readHumidity();


  float DHT2temp = dht2.readTemperature();




  display.print("T & H ");


  if ( mode1 >= 3 ) mode1 = 1;


  display.print("t = ");




  delaytime = R / 100 * 100 + 100;


  display.print(delaytime + 400);


  display.print(" ms");




  display.print(" m");


  display.println(mode1);








  if (mode1 == 1) {


    display.print(DHThum, 0); //小數點0位


    display.print("% ");


    display.print(DHTtemp, 1); //小數點1位


    display.println("C");


    display.setTextSize(2);


    if (cc > -127) {


      display.print(cc, 1);


    }


    display.print("C");


    if (i >= 6)i = 0;


    if (i < 6) {


      if (cc > -170) {


        cm0[i] = cc;


      } else {


        cm0[i] = 0;


      }


      display.setTextSize(1);


      display.setCursor(60 + 30 * (i % 2), (i / 2) * 6 + 10);


      display.print("*");


      display.setCursor(65, 10);


      display.print(cm0[0], 1);


      display.setCursor(95, 10);


      display.print(cm0[1], 1);


      display.setCursor(65, 16);


      display.print(cm0[2], 1);


      display.setCursor(95, 16);


      display.print(cm0[3], 1);


      display.setCursor(65, 22);


      display.print(cm0[4], 1);


      display.setCursor(95, 22);


      display.print(cm0[5], 1);


      i++;


    }


  }


  if (mode1 == 2) {


    if (i < 5) {


      if (DHThum >= 0) {


        cm0[i] = DHThum;


      } else {


        cm0[i] = 0;


      }


      if (i < 5) {


        if (DHT2hum >= 0) {


          cm1[i] = DHT2hum;


        } else {


          cm1[i] = 0;


        }


        if (i >= 4)i = 0;


        display.setTextSize(1);


        display.setCursor(5, 10);


        display.print(" H1   H2");


        display.setCursor(65, 10);


        display.print(" H1   H2");


        display.setCursor(60 * (i % 2), (i / 2) * 4 + 16);


        display.print("*");


        display.setCursor(8, 16);


        display.print(cm0[1], 0);


        display.print("%  ");


        display.print(cm1[1], 0);


        display.print("%");


        display.setCursor(68, 16);


        display.print(cm0[2], 0);


        display.print("%  ");


        display.print(cm1[2], 0);


        display.print("%");


        display.setCursor(8, 22);


        display.print(cm0[3], 0);


        display.print("%  ");


        display.print(cm1[3], 0);


        display.print("%");


        display.setCursor(68, 22);


        display.print(cm0[4], 0);


        display.print("%  ");


        display.print(cm1[4], 0);


        display.print("%");


      }


    }


    i++;


  }




  display.display();


  display.clearDisplay();


  delay(delaytime);


  delaytime = 0;


}




void motor(){


  R = 0;


  R = analogRead(potPin);


  R = map(R, 0, 1023, 0, 175);  // 0-1024 -> 0-180


  myservo.write(R);


  display.println("motor 5 ~ 180");


  display.setTextSize(2);


  display.print("angle  ");


  display.print(R+5);


  delay(15);


  display.display();


  display.clearDisplay();


}


void RGBLED(){


  R = 0;


  if ( mode1 >= 4 ) mode1 = 1;


  R = analogRead(potPin);


  R = map(R, 0, 1020, 0, 255);  // 0-1024 -> 0-255


  display.print("RGB LED");


  if(mode1==1){


    display.println("   R");


    cR=R;


  }else if(mode1==2){


    display.println("   G");


    cG=R;


  }else if(mode1==3){


    display.println("   B");


    cB=R;


  }


  display.print("R=");


  display.println(cR);


  display.print("G=");


  display.println(cG);


  display.print("B=");


  display.println(cB);


  display.display();


  display.clearDisplay();


  analogWrite(ledRPin, cR*0.8);//調弱輸出電壓,保護LED燈跟眼睛


  analogWrite(ledGPin, cG*0.8);


  analogWrite(ledBPin, cB*0.8);


}




void openmenu(){


  display.setTextSize(1);


  display.print("orangeV  TCJHS.lab V3");


  display.drawBitmap(0, 8, PHYduino_Logo, 128, 64, WHITE);


  display.display();


  display.clearDisplay();


  R = 0;


  mode1 = 1;


}




void Photoresistor(){


  int pr = analogRead(Photo);


  int cR = 0, cG = 0, cB = 0;


  if ( mode1 >= 5 ) mode1 = 1;


  display.print("Photo");


  if(mode1==1){


    display.println("   W");


    cR=200;


    cG=200;


    cB=200;


  }else if(mode1==2){


    display.println("   R");


    cR=200;


  }else if(mode1==3){


    display.println("   G");


    cG=200;


  }else if(mode1==4){


    display.println("   B");


    cB=200;


  }else{


    display.println("   clear");


    cR=0;


    cG=0;


    cB=0;


  }


  Serial.println(pr);


  display.setTextSize(2);


  display.print("Light ");


  display.print(pr);


  delay(15);


  display.display();


  display.clearDisplay();


  analogWrite(ledRPin, cR);//調弱輸出電壓,保護LED燈跟眼睛


  analogWrite(ledGPin, cG);


  analogWrite(ledBPin, cB);


}

2020年8月10日 星期一

第三次當導師也算新手-給新手導師的文件資源(在還沒見面以前)

如果今天自己有小孩,會希望別人怎麼對待自己子弟呢?
如果自己小時候,會希望別人怎麼對待我們呢?
身為一個導師可能可以成為學生的重要他人,也可以成為負面的重要敵人,我們該怎麼建立第一道的信任,其實在還沒開學前就開始了

還沒看到學生之前,一切的訊息只能當作資料,等見到學生之後,這些資料就可以結合學生散發出來的氣場與人格特質,彙整成為資訊了,而好的開始是成功的一半,成功的另一半就要靠長期的相處、陪伴與養成,還有很吃個人特質與和學生的相性,這些就只能求神明跟調性是否相符決定讓大家能互相幫助而不是互相傷害了。

重點還是做事情的目的,我們需要什麼資訊,讓我們能快速地了解對方,能增加更多的信任改而非成見,這些都是需要智慧的事情。

再還沒見面以前:知己知彼,建立資料

*以資料、資源為主而非資訊(不要帶有任何偏見去評估觀看這些資料)

(一)運用學校給的基本資料,了解學生狀況
    1.通訊錄-運用批次匯入建立google聯絡人
 點我下載
     2.在google map了解學生住家
        (1)與學校距離
        (2)用google街景看一下外觀,家訪用
        (3)學生家長職業,google搜尋一下,
                a.家長委員可能性
                b.家長資源
                c.職業試探的可能
    3.學生入學測驗成績
        入學分班時有考國數兩科,可以了解基礎狀況,另外英文可以於開學第一周進行測驗

(二)給家長的第一封簡訊
    1.問候
    2.加Line@
    3.提醒要來學校的時間
    4.告知導師基本資料
    5.運用google表單蒐集資料,順便了解家長手機是否可以上網         參考表單https://forms.gle/8if27pbP9nNq4txk8
            a.住址
            b.家中電話
            c.主要聯絡人手機
            d.子女是否有手機,電話,是否可上網,是否會攜帶來學校
            e.有沒有想提出的問題
            f.調查可以電訪時間

(三)電訪
    電訪主要的目的是建立關係並建立信任感,先安家長的心,也安學生的心     電訪可以透過聲音了解學生家長的想法,減少未來誤解的可能,並保持連絡暢通的第一步
    也可以解除家長:接到老師電話一定是壞事的設定(雖然未來的確是這樣啦...我會打電話給家長真的滿嚴重的了,好事就紀錄書寫在聯絡簿上吧)
    要事先作一下草稿或是檢核表,思考一下自己電訪的目的是什麼,有沒有達到目的
    1.了解家長認為的學生國小狀況
    2.了解家長對學生國中生活的期許
    3.跟學生談話,了解學生狀況,包含聲調、禮節、說話情緒等狀態

其實事前做再多,不一定有幫助,未來如何經營班級,如何呈現愛與榜樣,才是長期相處的唯一解藥,教師去學校也只是個職業,我們只是盡力培養國家未來人才,做好份內的工作而已,地球沒有自己還是會轉動,家庭不能解決的老師也不是神更難解決,社會的問題我們也是只能保持慈悲而已,唯一能做的就是陪伴學生跟家長渡過人生狂飆期,渡人一段路,隨喜自得。

2020年7月13日 星期一

科學周X成大-光學RPG解謎遊戲


今年科學周成大提供許多光學神器,於是就設計一連串的光學課程讓學生闖關,增添科學周的有趣程度

我每個關卡布置2關,3種 * 2 = 6,讓學生可以全班分成6組行動,每8分鐘換桌,最後統整答案說明。

1.紅外光關卡
第一關的設置是讓學生解讀這篇文章,在電腦裡輸入正確密碼就可以過關


密碼分成英文版跟注音文版,輸入正確後就由老師解說原理

下面是器材準備與擺設
器材是2個usb攝影機,其中一個拔除上面的紅外線濾光片,將兩個攝影機影像同步使用OBS軟體呈現,讓學生比較有無紅外線濾鏡的差異
擺設方式如下圖;筆電開啟OBS軟體,接兩台USB攝影機,紅色點點的那台去除紅外線濾鏡,讓學生觀察兩個圖的差異。
筆電+OBS軟體       (左紅點)去除濾鏡攝影機   (右)正常攝影機

請問你有發現下圖這兩張照片,裡面的植物有什麼特別的地方嗎?

(左)去除濾鏡攝影機   (右)正常攝影機
(左)去除濾鏡攝影機   (右)正常攝影機















真的植物在行光合作用時會發出紅外光,讓他在去除濾鏡的攝影機底下會特別明亮,假的植物就不會有明顯差異,這樣你可以找出這盆假植物裡面的真植物是誰嗎?



2.可見光關卡
學生解謎過程
故事是他們必須逃離綠色光線的阻擋,讓植物星人回到他們的星球,並且匯集混合藍光紅光,變成紫光降臨在紫色星球上,他們必須利用折射、反射、全反射、透鏡等原理完成,當然解法不只一種,當他們解完題後讓我拍照就可以過關

3.紫外光關卡
這關融合國文藏頭文、數學座標、光學高能紫外光、英文生物單字3領域4科目的跨域整合,學生必須從國文藏頭裡面看到魔王的弱點,從弱點處找到彩虹裡面哪一個顏色的變色珠是目標,對照座標圖找出(-2,3)的話,英文部分就是右方第二章(第二象限)的H,依此類推找出3個該顏色變色珠的位置就可以回推英文單字了。

擺設樣子
(左)彩虹   (右)四個象限,裡面只有三顆是目標
學生解謎過程
最後完成學習單,學習單部分當然是硬一點啦,還是希望他們學到一些科學知識


課程加碼-幼兒園合作課程

因為我一直想跟校園內的幼兒園合作,這個課程又非常適合,就請教務主任協助聯繫幼兒園園長,順利完成整個課程。

課前會議,跟水交社幼兒園園長介紹


幼兒園部分我帶3個國中生到幼兒園進行3站講解,每站10分鐘,最後我總結
3站分別是
1.光的混色+濾光玻璃紙:
這關主要讓園生能夠自行體驗,小老師只是稍微示範一下,用提問與嘗試讓他們看報不同顏色的世界,中高年級可以學習不同光的疊加,低年級就是好好玩玻璃紙就很有趣了




2.紫外光變色珠+紫外光的危險
這關就是利用數字卡跟變色珠,讓他們排出不同數字後照光,發現有螢光跟吸光變色的反應,並且跟小孩說不要照太多紫外光,對皮膚不好





3.光的直進與折射
這個課程運用成大給的方格紙,讓園生選擇適當的透鏡擺放,了解光也有可能會(轉彎)



希望幼兒園原生學會色光的疊加跟色彩疊加差異、不要照太多紫外光、光透過玻璃會轉彎等主要概念
讓國中生能體會教與學的成就、樂趣與困難
會後跟她們討論也發現她們收穫非常多,謝謝水交社幼兒園園長與老師、同學們的協助

過幾天後,我請這三個學生開檢討會,並請園長替這三個學生總結一下,希望她們能夠更有收穫

感謝成大提供這麼好的器材,感謝校長、教務主任、任課老師支持,同學的參與,讓我們能夠完成這次的科學周活動


以下是關卡表單下載
事前通知:
關卡:
學習單:
幼兒園課程:

2020年7月3日 星期五

arduino繪圖筆記

參考文章OLED顯示照片與圖像顯示實習

因為用了話比較漂亮圖的方式沒辦法跑其他程式,所以不能照上面那個網頁去繪圖,只能退而求其次用這個方法

因為螢幕的初始設定不一樣,要畫漂亮圖片的話就沒辦法跑一些阿里阿紮的東西,目前測試出用來點亮燈的analogWrite、發出聲音無緣蜂鳴器的noTone、超聲波測距的都不行,DHT溫濕度可以、ds18b20測溫度可以


------------參考文章的OLDE程式碼設定是--------------
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);
  Serial.println();
  // initialize with the I2C addr 0x3C
  if(display.begin(SSD1306_SWITCHCAPVCC, 0x3C))  // Address 0x3D for 128x64
  Serial.println("SSD1036 OLED allocation Successed!");
  else  {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
}

------------我用的OLED程式碼設定是-----------
//OLED設定
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
//螢幕設定,定義顯示高度跟寬度
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup() {
  // initialize with the I2C addr 0x3D (for the 128x64)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}


1.小畫家採用128*30畫素畫圖後,修飾一下圖片,想像輸出的時候會拉長1.5倍左右


2.使用網站http://javl.github.io/image2cpp/
設定如下
其他的步驟跟原文章都一樣
要輸出的程式碼是

const unsigned char Logo [] PROGMEM = {
};
void setup() {
}

//繪圖程式碼
display.drawBitmap(0, 0, Logo, 128, 64, WHITE);


就可以輸出圖片了

----------完整範例程式如下---------
/*
 * design by orangeV,taiwan,tainan 台南大成國中 蔡智恆
 * need libraries 需要程式庫<SPI.h>,<Wire.h>,<Adafruit_GFX.h>,<Adafruit_SSD1306.h>
 */

//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
//OLEDsetting
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

const unsigned char PHYduino_Logo [] PROGMEM = {
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 
0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 
0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 
0x66, 0xff, 0xfc, 0xff, 0xfc, 0xe0, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x66, 
0x66, 0x00, 0x14, 0xa0, 0x14, 0xa0, 0x68, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x66, 
0x66, 0xfc, 0x0c, 0xc0, 0x0c, 0xc0, 0x98, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x66, 
0x66, 0x0c, 0x0c, 0xc0, 0x00, 0x83, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa6, 
0x66, 0x0c, 0x0c, 0xc0, 0x00, 0x8c, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xe6, 
0x66, 0x0c, 0x1c, 0xe0, 0x00, 0xd0, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x06, 
0x66, 0xf7, 0xf4, 0xa0, 0x1c, 0xa0, 0x39, 0xff, 0xf7, 0x80, 0x7f, 0xc3, 0xf3, 0x06, 0x00, 0xe6, 
0x66, 0xac, 0x18, 0xff, 0xf4, 0xff, 0xe9, 0x40, 0x1e, 0x80, 0x51, 0x42, 0xd3, 0x05, 0xff, 0xa6, 
0x66, 0xcc, 0x00, 0x00, 0x0c, 0x00, 0x39, 0x80, 0x19, 0x80, 0xf1, 0xf3, 0x33, 0x06, 0x00, 0x66, 
0x66, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x19, 0x80, 0x19, 0x83, 0x31, 0x98, 0x33, 0x06, 0x00, 0x66, 
0x66, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x19, 0x80, 0x19, 0x8c, 0x31, 0x8e, 0x33, 0x06, 0x00, 0x66, 
0x66, 0x0e, 0x00, 0x00, 0x0c, 0x00, 0x39, 0xc0, 0x39, 0xb0, 0x31, 0x83, 0xb3, 0x92, 0x00, 0x66, 
0x66, 0x0a, 0x00, 0x00, 0x14, 0x00, 0x29, 0x40, 0x29, 0x40, 0x51, 0x40, 0xd2, 0xad, 0xff, 0xa6, 
0x67, 0x0f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf9, 0xc0, 0x73, 0xc6, 0x00, 0xe6, 
0x65, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x66, 
0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 
0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup() {
  Serial.begin(9600);
  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  display.clearDisplay();
  display.drawBitmap(0, 8, PHYduino_Logo, 128, 64, WHITE);
  display.display();
  delay(1500);
  display.clearDisplay();
}

void loop() {
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  display.print("By.orangeV  TCJHS.lab");
  display.drawBitmap(0, 8, PHYduino_Logo, 128, 64, WHITE);
  display.display();
  display.clearDisplay();
}