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);


}

沒有留言:

張貼留言