2019年10月18日 星期五

arduino物理實驗組:溫濕度+光學混光+音頻調整+超音波測距+馬達角度控制20191101

完成了一個可以處理國中物理相關問題的器材,包含光學、聲音、運動學、溫度變化的測量展示儀器,感謝龍山國中鄭志鵬小P老師讓我參考他的程式,還有網路上的其他資源,加上數位深耕計畫提供材料、金源與進度壓力才能逼迫我自己寫出這個東西。
基本上還缺一個功能就完整了,到時候再改版

基本上如果能夠照下方連接圖插好,把程式碼寫進去nano裡面就可以運作了

所需要準備的器材,露天買起來含電池總價大概是700多塊一套,可以請廠商協助裝成一盒
aduino nano V3.0 ATMEGA328P
arduino nano UNO多用 擴展板 (E006)
麵包板SYB-170
輕觸按鍵開關4P立式
電阻10KΩ
可變電阻WH148+梅花柄塑膠旋鈕
0.96吋黃藍雙色I2C IIC通信12864OLED

DHT11模組YS-31電子積木(A023)
DS18B20不鏽鋼封裝防水型
電阻4.7KΩ
LED紅綠藍各1 or LED共陰全彩
無源蜂鳴器5V
超音波測距模塊HC-SR04
伺服馬達SG90 Tower Pro

杜邦線公母頭 4色*3組,3色*4組,2色*1組

中號無格塑膠小盒子15.8*11.8*5.8即可收納
電源推薦18650+充電盒

連結圖如下(未連接到版上的黑色接GND,紅色接5V)

長按按鈕換選單,短按按鈕換功能,可調式電阻旋鈕調整採樣更新時間or數值

選單0  DHT11溫濕度+不鏽鋼防水溫度計
    功能1  顯示溫濕度+不鏽鋼溫度計溫度(採樣更新頻率100ms~1100ms)
    功能2  顯示溫濕度+不鏽鋼溫度計溫度+6組過去數值(採樣更新頻率100ms~1100ms)
    功能3  顯示溫濕度+不鏽鋼溫度計溫度+6組過去數值(採樣更新頻率1000ms~11000ms)
 


選單1 RGB燈(我加了一個衛生紙燈罩,可以讓顏色混和更均勻,其實就是用衛生紙把燈包起來就好)
    功能1  旋鈕調整R紅色亮度0~255
    功能2  旋鈕調整G紅色亮度0~255
    功能3  旋鈕調整B紅色亮度0~255
 


選單2 蜂鳴器
    功能1  旋鈕調整Hz頻率0~1000
    功能2  旋鈕調整Hz頻率0~10000
 


選單3 超音波測距(2cm~60cm較準確,僅取這一段)
    功能1  顯示距離(採樣更新頻率100ms~1100ms)
    功能2  顯示距離+9組過去數值(採樣更新頻率100ms~1100ms)
    功能3  顯示距離+9組過去數值(採樣更新頻率10ms~110ms)
 



選單4 伺服馬達
    功能  旋鈕調整馬達角度5~180
 




選單5 介紹畫面


---------------以下是arduino程式碼-------------
/*
 * 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>
 */
int
potPin = A3,
R = 0,
button = 2,
buzzer = 3,
motorPin = 4,
ds18b20 = 9,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
menu1N = 5,
menu2N = 6,
delaytime = 100;

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


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


//DHT11/22
#include <DHT.h>
DHT dht(DHTPin, 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 4
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





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


  //motor
  myservo.attach(motorPin);


  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  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 == 3)DHTxx();
  if(mode2 == 1)RGBLED();
    if ( mode2 != 1 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) noTone(buzzer);
  if(mode2 == 0)supersonic();
  if(mode2 == 4)motor();
    if ( mode2 != 4 ) myservo.write(0);
  if(mode2 == 5)openmenu();
 
}

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 openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  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(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    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 >= 4 ) 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==3) delaytime = delaytime/10;
  display.print(delaytime);
  if(mode1==2) delaytime = delaytime - 90;
  if(mode1==3) 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==2||mode1==3){
    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]);
      display.setCursor(95,10);
      display.print(cm0[1]);
      display.setCursor(115,10);
      display.print(cm0[2]); 
      display.setCursor(75,16);
      display.print(cm0[3]);
      display.setCursor(95,16);
      display.print(cm0[4]);
      display.setCursor(115,16);
      display.print(cm0[5]);
      display.setCursor(75,23);
      display.print(cm0[6]);
      display.setCursor(95,23);
      display.print(cm0[7]);
      display.setCursor(115,23);
      display.print(cm0[8]);
      i++;
    }
  }
  delay(delaytime);
}

void DHTxx(){
  sensors.requestTemperatures();
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  float cc = sensors.getTempCByIndex(0);
 
  display.print("T & H ");
 
  if ( mode1 >= 4 ) mode1 = 1; 
  display.print("t = ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  if(mode1==3) delaytime = delaytime*10;
  display.print(delaytime);
  display.println(" ms");
 
  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(mode1>=2){
    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++;
    }
  }
  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.4);
  analogWrite(ledBPin, cB*0.8);
}
--------------以上是程式碼--------------



自從學了比較正統的語言學之後,雖然覺得還是差很多練習,但是有感覺比較順一點了,目前工作進度是這樣,DHT11溫溼度、DS18b20溫度、超音波測距、顏色顯示與調整1按鈕1可變電阻、馬達可變電阻調整角度、發聲頻率調整等...

--------------第一版構思--------------
int
PulseWire = A2,
Threshold = 550,
potPin = A3,
R = 0,
ds18b20 = 1,
button = 2,
buzzer = 3,
motorPin = 4,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
cm = 0,
menu1N = 4,
menu2N = 6,
delaytime = 100;

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

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

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

//程式庫標頭檔
#include <OneWire.h>

//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
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

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

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

  //buzzer
  pinMode(buzzer,OUTPUT);

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

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  dht.begin();

  //motor
  myservo.attach(motorPin);
  myservo.write(90);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  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)RGBLED();
    if ( mode2 != 0 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  if(mode2 == 1)DHTxx();
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) {
      noTone(buzzer);
    } 
  if(mode2 == 3)supersonic();
  if(mode2 == 4)motor();
  if(mode2 == 5)openmenu();
}

void menu(){
  unsigned long duration = pulseIn(button, HIGH ,2500000);
  if (duration != 0) {               
    Serial.print("duration: ");
    Serial.print(duration);
    Serial.println(" microseconds");
    mode1 = mode1 + 1;
  } else {
    Serial.println("timeout");
    mode2 = mode2 + 1;
  }
  if ( mode2 == menu2N ) mode2 = 0;
  if ( mode1 == (menu1N+1) ) mode1 = 1;
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  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(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    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);
  long duration = pulseIn (echoPin, HIGH),
       cm = (duration) / 58.2
  ;

  if ( mode1 >= 3 ) mode1 = 1;
  display.print("SoundSonic");
  display.setCursor(100,0);
  display.print("mod");
  display.println(mode1);
  display.setTextSize(2);
  display.print(cm);
  display.setCursor(50,9); 
  display.println("CM");
  display.setTextSize(1);
  display.print("sampling=  ");
  R = analogRead(potPin);
  delaytime = R + 100;
  display.print(delaytime);
  display.setCursor(100,24);
  display.print("ms");
  display.display();
  display.clearDisplay();

  if(mode1==2){
    Serial.print(cm);
    Serial.print("CM");
    Serial.print(delaytime);
    Serial.println("ms");
  }
  delay(delaytime);
}

void DHTxx(){
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  display.println("DHT");
  display.setTextSize(2);
  display.print(DHThum,0);  //小數點0位
  display.print("% ");
  display.print(DHTtemp,1); //小數點1位
  display.print("C");
  display.display();
  display.clearDisplay();
  delay(delaytime);
}

void motor(){
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 180);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R);
  delay(15);
  display.display();
  display.clearDisplay();
}

void RGBLED(){
  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);
  analogWrite(ledGPin, cG);
  analogWrite(ledBPin, cB);
}


--------------第二版按鈕不敏銳--------------
int
PulseWire = A2,
Threshold = 550,
potPin = A3,
R = 0,
ds18b20 = 1,
button = 2,
buzzer = 3,
motorPin = 4,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
cm = 0,
menu1N = 4,
menu2N = 6,
delaytime = 100;

int i=0 , j,cm0[6]={0};

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

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

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

//程式庫標頭檔
#include <OneWire.h>

//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
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

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

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

  //buzzer
  pinMode(buzzer,OUTPUT);

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

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  dht.begin();

  //motor
  myservo.attach(motorPin);
  myservo.write(0);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  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 == 3)RGBLED();
    if ( mode2 != 0 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  if(mode2 == 1)DHTxx();
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) {
      noTone(buzzer);
    }
  if(mode2 == 0)supersonic();
  if(mode2 == 4)motor();
  if(mode2 == 5)openmenu();
}

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+1) ) mode1 = 1;
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  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(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    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);
  long duration = pulseIn (echoPin, HIGH),
      cm = (duration) / 58.2
  ;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("SoundSonic");
  display.setCursor(100,0);
  display.print("mod");
  display.println(mode1);
  display.setTextSize(1);
  display.print("sampling=  ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  display.print(delaytime);
  display.setCursor(100,8);
  display.println("ms");

  display.setTextSize(2);
  if (cm<60&&cm>3){
    display.print(cm);
  }else{
    display.print("??");
  }
  display.setCursor(45,16);
  display.println("CM");
  display.display();
  display.clearDisplay();

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

void DHTxx(){
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  display.println("DHT");
  display.setTextSize(2);
  display.print(DHThum,0);  //小數點0位
  display.print("% ");
  display.print(DHTtemp,1); //小數點1位
  display.print("C");
  display.display();
  display.clearDisplay();
  delay(delaytime);
}

void motor(){
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 180);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R);
  delay(15);
  display.display();
  display.clearDisplay();
}

void RGBLED(){
  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);
  analogWrite(ledGPin, cG);
  analogWrite(ledBPin, cB);
}

--------------第三版快完成了--------------
int
PulseWire = A2,
Threshold = 550,
potPin = A3,
R = 0,
button = 2,
buzzer = 3,
motorPin = 4,
ds18b20 = 9,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
menu1N = 4,
menu2N = 6,
delaytime = 100;

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

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

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



//
#include <OneWire.h>

//DS18b20
#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 4
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

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

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

  //buzzer
  pinMode(buzzer,OUTPUT);

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

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  dht.begin();

  //motor
  myservo.attach(motorPin);
  myservo.write(0);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  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 != 1 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  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 == 5)openmenu();
}

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+1) ) mode1 = 1;
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  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(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    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 >= 4 ) 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==3) delaytime = delaytime/10;
  display.print(delaytime);
  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==2||mode1==3){
    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]);
      display.setCursor(95,10);
      display.print(cm0[1]);
      display.setCursor(115,10);
      display.print(cm0[2]);
      display.setCursor(75,16);
      display.print(cm0[3]);
      display.setCursor(95,16);
      display.print(cm0[4]);
      display.setCursor(115,16);
      display.print(cm0[5]);
      display.setCursor(75,23);
      display.print(cm0[6]);
      display.setCursor(95,23);
      display.print(cm0[7]);
      display.setCursor(115,23);
      display.print(cm0[8]);
      i++;
    }
  }
  delay(delaytime);
}

void DHTxx(){
  sensors.requestTemperatures();
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  float cc = sensors.getTempCByIndex(0);

  display.print("T & H ");

  if ( mode1 >= 4 ) mode1 = 1;
  display.print("t = ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  if(mode1==3) delaytime = delaytime*10;
  display.print(delaytime);
  display.println(" ms");

  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(mode1>=2){
    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++;
    }
  }
  display.display();
  display.clearDisplay();
  delay(delaytime);
  delaytime = 0;
}

void motor(){
  R = 0;
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 180);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R);
  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);
  analogWrite(ledGPin, cG);
  analogWrite(ledBPin, cB);
}


----
按鍵程式參考
https://www.geek-workshop.com/thread-28007-1-1.html



1 則留言: