Translate

2023年11月29日 星期三

arduino使用七段顯示器,腳位使用可以簡化程式碼並使用PORT暫存器直接一次將值送給七段

unsigned long time_delay=0;
byte state_7=0;
byte segCount=0;
//共陽極 dp a b c d e f g
byte seven_seg_digits[10] = {0b00000001,  // = 0
                             0b01001111,  // = 1
                             0b00010010,  // = 2
                             0b00000110,  // = 3
                             0b01001100,  // = 4
                             0b00100100,  // = 5
                             0b00100000,  // = 6
                             0b00001111,  // = 7
                             0b00000000,  // = 8
                             0b00000100   // = 9
                             };

void setup() {                
  pinMode(2, OUTPUT);   //a
  pinMode(3, OUTPUT);  //b
  pinMode(4, OUTPUT); //c
  pinMode(5, OUTPUT); //d
  pinMode(6, OUTPUT); //e
  pinMode(7, OUTPUT); //f
  pinMode(8, OUTPUT); //g
}
    
void sevenSegWrite(byte digit) {  //顯示特定數字的副程式
  byte pin = 2;  //我們的七段顯示是從pin2開始的
  for (byte i = 0; i < 7;i++) {
    digitalWrite(pin+i, (seven_seg_digits[digit]>>(6-i))&0b00000001);
  }
}

void loop() {
  //數字從9開始倒數,每個數字間隔1秒
  if (state_7==0)
  {
    sevenSegWrite(segCount);
    time_delay=millis();
    state_7=1;
  }
  else
  {
    if((millis()-time_delay)>1000)
    {
      state_7=0;
      
      if(segCount==9)
      {
        segCount=0;
      }
      else
      {
        segCount++;
      }
    }
  }

}

unsigned long time_delay=0;
byte state_7=0;
byte segCount=0;
//共陽極 dp a b c d e f g
byte seven_seg_digits[10] = {0b00000001,  // = 0
                             0b01001111,  // = 1
                             0b00010010,  // = 2
                             0b00000110,  // = 3
                             0b01001100,  // = 4
                             0b00100100,  // = 5
                             0b00100000,  // = 6
                             0b00001111,  // = 7
                             0b00000000,  // = 8
                             0b00000100   // = 9
                             };

void setup() {    
  DDRD=0x7f;//設定0~7腳為輸出
}
void loop() {
  //數字從9開始倒數,每個數字間隔1秒
  if (state_7==0)
  {
    PORTD=seven_seg_digits[segCount];
    time_delay=millis();
    state_7=1;
  }
  else
  {
    if((millis()-time_delay)>1000)
    {
      state_7=0;
      
      if(segCount==9)
      {
        segCount=0;
      }
      else
      {
        segCount++;
      }
    }
  }

}

利用tinkercad模擬arduino控制LCD自建字型

 參考網站:臺南市教育局科技教育網-自建字型





#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(32,16,2);
 
byte yearChar[8]={B01000,B11111,B00010,B01111,B01010,B11111,B00010,B00000};
byte moonChar[8]={B01111,B01001,B01111,B01001,B01111,B01001,B11101,B00000};
byte dayChar[8]={B01111,B01001,B01001,B01111,B01001,B01001,B01111,B00000};
int years=2023;
byte moons=11;
byte days=29;
void setup() 
{
  lcd.init();
  lcd.backlight(); 
  lcd.createChar(0,yearChar);
  lcd.createChar(1,moonChar);
  lcd.createChar(2,dayChar);  
}   
void loop() 
{
  lcd.setCursor(0,0);
  lcd.print(years);
  lcd.write(byte(0)); 
  lcd.print(moons);
  lcd.write(byte(1));
  lcd.print(days);
  lcd.write(byte(2));
}




2023年4月17日 星期一

使用tinkercad模擬arduino 控制LCD 16X2(I2C) PCF8574

 tinkercad 預設的LCD I2C範例係使用MCP23008型

電路接線

將LCD的VCC接到Arduino板上的5V、GND(LCD)接GND(Arduino)、SCL(LCD)接A5或Aref左邊第2腳(Arduino)、SDA(LCD)接A4或Aref左邊第1腳(Arduino)


但因為自已係使用PCF8574型,範例程式沒辦法使用。網路上找了一些資料如下面範例。

點選LCD可以將類型改成PCF8574型,地址用預設的32,也可以改成您想要的,但呼叫元件時第1個參數記得改您最後設定值。


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(32,16,2);  //設定參數(地址,行數,列數)

void setup()
{
  lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Hello, world!");
  lcd.setCursor(0,1);
  lcd.print("2023/04/17");
  lcd.setCursor(0,2);
}

void loop()
{

}

2022年5月6日 星期五

荖葉莖部病害(細菌、真菌)

 

上圖係黑骨受細菌感染

上圖係炭疽病(受真菌感染)
上圖係受真菌感染後期產生孢子

荖葉莖部受病害感染初期看不出來係細菌還是真菌感染,真菌感染的後期會產生孢子。所以要防治要二種藥(細菌與真菌 )一起施用。

照片來源:農試所