2021年12月18日 星期六

CNY70

 void setup()

{

  pinMode(2, OUTPUT);

  pinMode(3, OUTPUT);

  digitalWrite(2, LOW);

  digitalWrite(3, LOW);

  Serial.begin(9600);

}

void loop()

{

  if(analogRead(A5)>100 && analogRead(A5)<200)

  {

     digitalWrite(2, HIGH);

  }

  if(analogRead(A5)<100)

  {

     digitalWrite(2, LOW);

     digitalWrite(3, LOW);

  }

  if(analogRead(A5)>300 && analogRead(A5)<1000)

  {

     digitalWrite(3, HIGH);

  }

  Serial.println(analogRead(A5));

  delay(1000);


Arduino : CNY70

2013年4月28日 星期日
幾年前在玩樂高機器人,看到一篇自製紅外線感應器的文章,買材料時順手買了兩顆 CNY70,當時很天真認為它也有紅外線的發射和接收,以為可以直接應用在樂高,結果一直沒用上。現在將它接在 Arduino 上,可以利用讀數來偵測黑白顏色。

材料:

  • CNY70 x 1
  • 電阻 220 歐姆 x 1
  • 電阻 10k 歐姆 x 1

資料來源:https://gsyan888.blogspot.com/2013/04/arduino-cny70.html
下面是將 CNY70 和 Arduino 連接的配置圖:

由俯視圖來看,如果 CNY70 的 Mark 在右側,右側是紅外線收接端 (D),而左側是紅外線發射端 (E)。如果 CNY70前是黑色的,A0 會呈現低電位狀態,相反的,如果 CNY70 前是白色時,A0 會是呈現高電位狀態。

我們可以利用下面的程式碼來觀察數值的變化:

const int irPin = 0;
void setup() {
  Serial.begin(115200);
  pinMode(irPin , INPUT);
}
void loop() {
  int irVal = analogRead(irPin);
  Serial.println(irVal);
  delay(100);
}

利用觀察到的數值,如果再加兩顆馬達,就可以玩追著黑線跑的自走車了:

  • 如果數值是黑色的範圍,就驅動前進的馬達。
  • 如果數值是白色的範圍,就驅動左右轉的馬達,先順(逆)時轉一下,找不到黑線就再反方向轉,找到了就繼續驅動前進的馬達。
如果用更多顆 CNY70 ,就可以更精準的判斷方向。

2021年12月10日 星期五

分十等分,超過就加就鎖住250

 int i = 0;

void setup()

{

  pinMode(3, OUTPUT);

  digitalWrite(3, LOW);//一開機就設定為低電位

  pinMode(2, INPUT);

  digitalWrite(2, HIGH);//一開機就設定為高電位

  Serial.begin(9600);

}


void loop()

{

  if (digitalRead(2) == 0)

  {

    delay(1000);

    while (digitalRead(2) == 0);

     i = i + 25;

    analogWrite(3, i);  


    if (i >= 255)//超過255,再壓一下進來是25

    {

      i = 250;

    }


    Serial.println(i);

  }

}

不做用for loop 呼吸燈

 void setup()

{

 pinMode(3,OUTPUT);

}


void loop()

{

 analogWrite(3,50);

 delay(1000);

 analogWrite(3,127);

 delay(1000);

 analogWrite(3,255);

 delay(1000);

}

h m s

int  Time_second;

int Time_minute;

int  Time_hour;

unsigned long Time_hour_setting = 3600000; //1小時=60min 佔多少milli sec ,所以還要乘以1000

unsigned long Time_minute_setting = 60000;//1分=60秒 60 000ms

unsigned long Time_second_setting = 1000;//1秒=1000ms

//儲取millis()的變數

unsigned long start_time ;

void setup()

{

  Serial.begin(9600);


}


void loop()

{

  start_time=millis();

  Serial.print(start_time);

  Serial.print("  ");//演算法

  Time_hour = start_time / 3600000; //小時  取到的值除小時得商為小時

  Time_minute = (start_time % 3600000) / 60000;     //分鐘   取到的值除小時 取餘數再除分 𢔽分

  Time_second = ((start_time % 3600000) % 60000) / 1000; //秒 取到的值除小時除分 取餘數再除秒取商數 𢔽分


  Serial.print(Time_hour);

  Serial.print(":");

  Serial.print(Time_minute);

  Serial.print(":");

  Serial.println(Time_second);

}

宣告整數 有正整數 負整數 0~32767 -32768~-1

 int  start_time;

void setup()

{

  Serial.begin(9600);

  int i = 32767;

  int a, b, c, d, e, f, g;

  Serial.println(a = i + 1);//-32768

  Serial.println(a = i + 2);//-32767

  Serial.println(a = i + 3);//-32766

  Serial.println(a = i + 4);//-32768

  Serial.println(a = i + 5);//-32764

  Serial.println(a = i + 32767);//-2

  Serial.println(a = i + 32768);//-1

  Serial.println(a = i + 32769);//0

}


void loop()

{


}

2021年12月5日 星期日

 #include <iostream>

#include <iomanip>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

int main(int argc, char** argv)

{

cout<<setw(5)<<1234;//使用字段寬度設定 

return 0;

}

array

 #include <stdio.h>

#include <stdlib.h>

int main() 

{

  int v[]={1,2,3,4,5};

  int i;

  for(i=0;i<5;i++) 

  {

    printf("%d\n",v[i]);

  }

}


#include <stdio.h>

#include <stdlib.h>

int main() 

{

  int v[]={1,2,3,4,5};

  int *n=v;//int *n =&v[0]

  int i;

  for(i=0;i<5;i++) 

  {

    printf("%d\n",*(n+i)); //指標取值 

  }

}

2021年12月4日 星期六

pointer

 #include <stdio.h>

#include <stdlib.h>

int addone(int *n)//int *

{

*n=*n+1;//位址的內容沒有int , 讀值或修改值,*星號位址值+1

}

int main() 

{

 int a=3;

 addone(&a);//複制a的記憶體位址給 addone ,可以改變本尊

 printf("%d\n",a);

 return 0;

}

副程式練習

 #include <stdio.h>

#include <stdlib.h>

int addone(int n)

{

n++;

return n;

}

int main() 

{

 int a=3;

 int b=addone(a);

 printf("%d\n",b); 

 return 0;

}

搭車問題共要幾台車

 #include <stdio.h>

#include <stdlib.h>

int main() 

{

 int people=5;

 int capacity=4;

 int x=0;//x設定商數 人數/容量 , 商數=0就不用exe

 int y=0;

 x=people / capacity;

 printf("%d\n",x);

 y=people % capacity;//y設定商數 人數 mod 容量

 printf("%d\n",y);

 if(x !=0 && y !=0)//商數要不等於0且 mod不可以等於0,才exe, 

 {

  x ++;

  printf("%d",x);

 }

return 0;

}

doulbe 除的問題

 #include <stdio.h>

#include <stdlib.h>

int main() 

{

    int val1=10;

    int val2=4;

    int result1=0;

    int result2=0;

    int result3=0;

    double result4=0;

    printf("%d\n",result1=val1+val2);//整數+整數 

    printf("%d\n",result2=val1-val2);//整數-整數

    printf("%d\n",result3=val1*val2);//整數*整數

   printf("%f\n",result4=(double)val1/(double)val2);//整數除整數是整數在assign result 

return 0;

}


#include <stdio.h>

#include <stdlib.h>

int main() 

{

    int val1=10;

    float val2=4;

    float result1=0;

    float result2=0;

    float result3=0;

    float result4=0;

    printf("%d\n",result1=val1+val2);//整數+整數 

    printf("%d\n",result2=val1-val2);//整數-整數

    printf("%d\n",result3=val1*val2);//整數*整數

   printf("%f\n",result4=val1/val2);//整數除整數是整數在assign result 

   //其被加數、或被減數、被乘數、被除數只要其中設一個float即可,但+ - * 會有問題 

return 0;

}


#include <stdio.h>

#include <stdlib.h>

int main() 

{

    int val1=10;

    int val2=4;

    int result1=0;

    int result2=0;

    int result3=0;

    float result4=0;

    printf("%d\n",result1=val1+val2);//整數+整數 

    printf("%d\n",result2=val1-val2);//整數-整數

    printf("%d\n",result3=val1*val2);//整數*整數

   printf("%f\n",result4=(float)val1/(float)val2);//整數除整數是整數在assign result 

return 0;

}

1+.....1000=500500

 #include <stdio.h>

#include <stdlib.h>

int main() 

{

  int sum=0;

  int i=0;

  int j;

  for(j=1;j<=1000;j++)//500500

  {

  sum=sum+j;

  }

  printf("%d\n",sum);

return 0;

}

2進位與16進位

 #include <stdio.h>

#include <stdlib.h>

int main() 

{

    //2進位表示法bits

//01

//0b1111111

//16進位表示法 hex

//0123456789abcdef

//0x11223344

printf("%x\n",255); 

return 0;

}


#include <stdio.h>

#include <stdlib.h>

int main() 

{

    //2進位表示法bits

//01

//0b11111111//硬體控制會寫到

//16進位表示法 hex

//0123456789abcdef

//0x11223344

printf("%x\n",0b11111111); //compiler是認得的

return 0;

}


#include <stdio.h>

#include <stdlib.h>

int main() 

{

  char word0='a';

  printf("%c\n",word0) ;

  printf("%c \n",97);

  printf("%c\n",0x61);

return 0;

}

relational operators 關係運算子

 #include <stdio.h>

#include <stdlib.h>

int main() 

{

//relational operators 關係運算子

int result =10>2;

if(result)

{

printf("Hello");

return 0;

}


#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() 

{

//relational operators 關係運算子

bool result =10>2;

if(result)

{

printf("%d\n",sizeof(result));

return 0;

}



#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() 

{

//relational operators 關係運算子

bool result =10>=10;//10沒有大於10  自已沒有大於自已 不成立 false 

//10>=10 自已有大於等於自已 成立 true 

if(result)

{

printf("%d\n",sizeof(result));

return 0;

}


#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() 

{

//relational operators 關係運算子

bool result =(10 == 10);

//10==10為了區別,用小括號 

//10沒有大於10  自已沒有大於自已 不成立 false 

//10>=10 自已有大於等於自已 成立 true

//一個等號assign 兩個等號就是比較 

if(result)

{

printf("%d\n",sizeof(result));

return 0;

}


#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() 

{

//relational operators 關係運算子

bool result =(10 != 10);

//驚嘆號就是反過來的意思 

//10==10為了區別,用小括號 

//10沒有大於10  自已沒有大於自已 不成立 false 

//10>=10 自已有大於等於自已 成立 true

//一個等號assign 兩個等號就是比較 

if(result)

{

printf("%d\n",sizeof(result));

return 0;

}


#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() 

{

//relational operators 關係運算子

bool result =(10 == 10);

//驚嘆號就是反過來的意思 

//10==10為了區別,用小括號 

//10沒有大於10  自已沒有大於自已 不成立 false 

//10>=10 自已有大於等於自已 成立 true

//一個等號assign 兩個等號就是比較 

if(!result)//驚嘆號要做用在布林值 

{

printf("%d\n",sizeof(result));

return 0;

}


#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() 

{

//relational operators 關係運算子

bool result =(10 == 10);

//有時問題不是只有對跟錯,而是有些方案,就有else if, 就不會是boolean 而是else if 可以有好多個 

//驚嘆號就是反過來的意思 

//10==10為了區別,用小括號 

//10沒有大於10  自已沒有大於自已 不成立 false 

//10>=10 自已有大於等於自已 成立 true

//一個等號assign 兩個等號就是比較 

if(!result)//驚嘆號要做用在布林值 

{

printf("%d\n",sizeof(result));

return 0;

}


#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() 

{

int val=2;

if(val<1)

{

printf("004");

}

else if(val<=2)

{

printf("001");

}

else if(val<=2)//此行由上往下,因上面exe了,所以下面不會被exe 

{

printf("002");

}

else

{

printf("null");

}

return 0;

}


#include <stdio.h>

#include <stdlib.h>

int main() 

{

int people=11;//人數 

int capacity=5;//一台車可以容納5個人 

int cars=0;//一開始車子設定為0 

int left_people=0;//剩下的人數 

cars=people/capacity;//要幾台車子是人數除以容量 

left_people=people % capacity;//剩下的人數=人數  

if(left_people>0) //語意比較容昜看懂

{

cars ++;

left_people = 0;

}

printf("需要幾台車: %d\n",cars);

printf("有幾人沒搭到車: %d\n",left_people); 

return 0;

}

搭車人數

 #include <stdio.h>

#include <stdlib.h>

int main() 

{

int people=11;//人數 

int capacity=5;//一台車可以容納5個人 

int cars=0;//一開始車子設定為0 

int left_people=0;//剩下的人數 

cars=people/capacity;//要幾台車子是人數除以容量 

left_people=people % capacity;//剩下的人數=人數 取車子的mod 

if(left_people)//沒有整除就是不是0,車量要加加 

{

cars ++;

left_people = 0;

}

printf("需要幾台車: %d\n",cars);

printf("有幾人沒搭到車: %d\n",left_people);

return 0;

}

c語言是非0為1 0為false

 #include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>//c語言是非0為1 0為false 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int main() 

{

if(true)

{

printf("OK");

}

return 0;

}

/* compiler就被代換(前置處理,前面取代後面,與變數不一樣)

#define bool _Bool

#define true 1

#define false 0

*/

8-13 dip

 char seg7_table[] = {

                      ~0xc0, ~0xf9, ~0xa4, ~0xb0, ~0x99, ~0x92, ~0x82, ~0xf8, ~0x80, ~0x90,

                      ~0x88, ~0x83, ~0xc6,~0xa1, ~0x86, ~0x8e

                    };

byte weight[] = {8, 4, 2, 1};

byte seg7_pin[] = {2, 3, 4, 5, 6, 7, 8};

byte dip_sw[] = {9, 10, 11, 12};

byte number;

//----------------------------------------------------


void setup()

{

  for (int i = 0; i < 7; i++)

  {

    pinMode(seg7_pin[i], OUTPUT);

   }

  for(int j=0;j<4;j++)

  {

    pinMode(dip_sw[j],INPUT);

   }

  Serial.begin(9600);

}

void tx(byte rx)

{

  for (int x = 0; x < 7; x++)//只是讓他跑七段

  {

    if (rx % 2 == 1)

    {

      digitalWrite(seg7_pin[x], HIGH);

    }

    else

    {

      digitalWrite(seg7_pin[x], LOW);

    }

    rx = rx / 2;

  }

}

void loop()

{

  number = 0;        

  for ( int i = 0; i < 4; i++)

  {

    if (digitalRead(dip_sw[i]) == HIGH)

    {

      number = number + weight[i];Serial.println(number);

    }

  }

  tx(seg7_table[number]);  

}

8-13 dip

 int seg7_pin[] = {2, 3, 4, 5, 6, 7, 8};

int dip_sw[] = {9, 10, 11, 12};

int weight[] = {8, 4, 2, 1};

int seg7_table[] = {~0xc0, ~0xf9, ~0xa4, ~0xb0, ~0x99, ~0x92, ~0x82, ~0xf8, ~0x80, ~0x90,

                    ~0x88, ~0x8c, ~0xc6, ~0xa1, ~0x86, ~0x8e//寫是寫共陽,加個毛毛蟲(是bitwise),不是!(為真變假,假變真

                   };

int i;

int number;

void setup()

{

  for (int a = 0; a < 7; a++)

  {

    pinMode(seg7_pin[a], OUTPUT);

  }

  Serial.begin(9600);

}

void tx(byte rx)

{

  int x;

  for (x = 0; x < 7; x++)

  {

    if (rx % 2 == 1)

      digitalWrite(seg7_pin[x], HIGH);//板子是共陰,給高電位七段顯示器才會亮

    else

      digitalWrite(seg7_pin[x], LOW);

    rx = rx / 2;

  }

}

void loop()

{

  number = 0;

  for (i = 0; i < 4; i++)

  {

    if (digitalRead(dip_sw[i]) == HIGH)//    if (digitalRead(dip_sw[i] == HIGH))括號括錯了

      number = number + weight[i];//記得權值加中括號

      Serial.println(number);

  }

  tx(seg7_table[number]);

}

指撥開關 一開機向左移1秒 再切換向右移0.3秒

 int cnt=2;

byte val=0;

void setup()

{

  pinMode(10,INPUT);

  for (int i = 2; i < 10; i++)//想法是腳位2~9共8支腳

  {

    pinMode(i, OUTPUT);//全設為輸出

    digitalWrite(i, LOW);//全設為低電位

  }

}

void loop()

{

  if (digitalRead(10)==0)//一開機讀的值為0由右向左跑一秒

  {

    digitalWrite(cnt, HIGH); delay(1000);//不可以用loop寫,因為不可以隨時切換

    digitalWrite(cnt, LOW); delay(10);

    cnt++;

    if(cnt>9)//超過9,cnt設為0

    {

      cnt=0;

    }

  }

  else

  {

    digitalWrite(cnt, HIGH); delay(300);//讀的值為1由左向右跑0.3秒

    digitalWrite(cnt, LOW); delay(10);

    cnt--;

    if(cnt<0)//因為小於0,所以有負數,cnt不可以宣告byte , 要宣告因為有正負數

    {

      cnt=9;//小於0,設為9

    }

  }

}

cond 1 蜂鳴器叫三聲 、cond 2 led亮三下

 boolean x = 0;//x為旗標蜂鳴器

boolean y = 0;//y為旗標led 13 pin

void setup()

{

  pinMode(13, OUTPUT);

  digitalWrite(13,LOW);

  Serial.begin(9600);

}


void loop()

{

  if (x == 0)//因為程式是由上往下exe, 狀況1:exe beep

  {

    for (int i = 0; i < 3; i++)

    {

      tone(7, 300);

      delay(100);

      noTone(7);

      delay(1000);

    }

    x = 1;

  }

  if (y == 0)//狀況2:exe led

  {

    for (int i = 0; i < 3; i++)

    {

      digitalWrite(13, HIGH);

      delay(1000);

      digitalWrite(13, LOW);

      delay(1000);

    }

    y=1;

  }}

一開機beep 三聲

 boolean state = 0;//先設flag為0

void setup()

{


}


void loop()

{

  if (state == 0)//進來為0,跑三次

  {

    for (int i = 0; i < 3; i++)

    {

      tone(7, 500);

      delay(500);

      noTone(7);

      delay(1000);

    }

    state = 1;//跑完三次後,flag設為1就不會在exe,相當開機時,exe 三次

  }

}

algorithm

 #include <iostream> #include <string.h> using namespace std; int main(int argc, char** argv)  { for(int j=2;j<=100;j++)//j...