顯示包含「Arduino學習」標籤的文章。顯示所有文章
顯示包含「Arduino學習」標籤的文章。顯示所有文章

2021年11月16日星期二

Arduino 小專題 TFT+BMP180

 最近天氣變冷了,女友一直說很冷,但是實際到底溫度多少,我還真的不知道,手機看也是地區的平均氣溫,身為工程師,當然是自己來土炮一個溫度計阿!!!哈哈哈

 可惜的是手邊只有BMP180 模組,想說都它有個功能可以拿來量溫度,那就決定是他了!BMP180!


目標

透過TFT螢幕顯示房間的溫度與氣壓

 

材料

Arduino NANO

TFT 1.8 SPI

BMP180

杜邦縣若干條

 

軟體

Arduino IDE

     1.8.12

Arduino lib 安裝

                開啟程式庫管理員->輸入BMP180並安裝


                開啟程式庫管理員->輸入TFT並安裝


接線說明

TFT模組

Arduino NANO

LED

3.3V

SCK

D13

SDA

D11

A0

D9

RESET

D8

CS

D10

GND

GND

VCC

+5V

   

BMP180

Arduino NANO

VIN

+5V

GND

GND

SCL

A5

SDA

A4


程式碼

程式碼部分小弟就全數奉上了,希望有幫到各位看官

#include<Wire.h>
#include  
#include 
#include 

// pin definition for Arduino UNO
#define cs   10
#define dc   9
#define rst  8

Adafruit_BMP085 bmp;
TFT TFTscreen = TFT(cs, dc, rst);
String TempTextShow="";
String PresTextShow="";
char TempPrintout[5];
char PresPrintout[5];
float LastTmp = 0.0;
float LastPressure = 0.0;

void setup() {
  Serial.begin(9600);
  //initialize the library
  TFTscreen.begin();

  // clear the screen with a black background
  TFTscreen.background(0, 0, 0);
  //set the text size
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(155,155,155);
  TFTscreen.text("Temperture:",12, 10);
  TFTscreen.text("Pressure:",12, 50);

  if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");

	TFTscreen.text("ERROR", 70, 30);
	TFTscreen.text("ERROR", 70, 70);
	while (1) {}

  }

  LastTmp = bmp.readTemperature();
  LastPressure = bmp.readSealevelPressure();

}
void loop() {

  if(LastTmp != bmp.readTemperature())
  {
    //Clear Old Data
    TFTscreen.stroke(0, 0, 0);
    TFTscreen.text(TempPrintout, 70, 30);

    LastTmp = bmp.readTemperature();
    TempTextShow = String(LastTmp);
    TempTextShow.toCharArray(TempPrintout, 5);
  }

  if(LastPressure != bmp.readSealevelPressure())
  {
    //Clear Old Data
    TFTscreen.stroke(0, 0, 0);
    TFTscreen.text(PresPrintout, 70, 70);

    LastTmp = bmp.readSealevelPressure();
    PresTextShow = String(LastPressure);
    PresTextShow.toCharArray(PresPrintout, 5);
  }

    TFTscreen.stroke(155, 155, 155);
    TFTscreen.text(TempPrintout, 70, 30);
    TFTscreen.text(PresPrintout, 70, 70);

    delay(1000);
}

參考資料

https://randomnerdtutorials.com/guide-to-1-8-tft-display-with-arduino/

https://www.arduino.cc/en/Reference/TFTConstructor

https://www.arduino.cc/en/Tutorial/LibraryExamples/EsploraTFTTemp


2021年7月11日星期日

Arduino 讀寫外部EEPROM AT24C256


今天來實驗下IIC 讀寫外部EEPROM,這邊可能有部分讀者會覺得奇怪,阿arduino 本身不是就有了嗎?這句話是沒錯拉,但是畢竟是在MCU內部的,所以內部的EEPROM 也會有大小上的限制,先來看一下資料手冊,由於我是使用arduino NANO,我查NANO 上面的atmel MCU EEPROM的大小



這邊我們可以看到內建只有1kbytes,其實也不小了拉,但是總是有其他時候會需要,那我們先了解起來,萬一哪天需要紀錄一堆變數資料且,需要斷電再開啟時不被清除,就很需要了

 

開發環境

Arduino IDE 1.8.2

 

材料

1.      at24c256 模組

2.      Arduino Nano + Nano擴展板

3.      杜邦線 n

4.      邏輯分析儀 一台

 

接線說明

NANO

At24C256

Vcc

Vcc

A5

SCL

A4

SDA

Gns

Gnd

 

 

這邊說一下,再使用arduino IIC library 時,有些時候我們不知道是否是真的有把資料寫進去,所以需要使用邏輯分析儀(下次有空來寫一下使用教學),確認寫入讀取行為是符合時序。

Step1 模組認識

在使用模組前,一定要先大致上看一下資料手冊喔

使用電壓為DC 5V















設定晶片的位址是透過設定A1 A0 腳位





腳位功能描述




對應到模組上面腳位

模組腳位

功能

Vcc

電源

SCL

通訊用

SDA

通訊用

GND

電源

A0

設定位址

A1

設定位址

A2

沒功能

WP

寫入保護


 

大略看完資料手冊後,會發現A2?A2要做甚麼?其實A2沒功能啦


模組上面的接腳,可以透過使用短路帽來決定設備位址



這邊先用預設,如下圖



接下來如果At24C256 模組與NANO 接好後如下


 

Step2 寫程式-寫入資料

要怎麼寫入AT24C256,要看一下資料手冊的協定,如下圖


紅色的地方是晶片的位置,藍色的地方是晶片內部欲存放資料的位址,Data就是要存入的資料

如果模組上面的短路帽有照我的方式接的話,Device Address 0x50 ,接下來我們嘗試在晶片的

0x00位址寫入一個字元’H’

 

#include <Wire.h>

#define DeviceAddress 0x50

 void setup() {

  Wire.begin();

  Serial.begin(9600);

}

void loop() {

  I2C_write('H');

}

void I2C_write(unsigned char data)

{

  Wire.beginTransmission(0x50); // transmit to device

  Wire.write(0x00);              // sends one byte

  Wire.write(0x00);              // sends one byte

  Wire.write(data);              // sends one byte

  Wire.endTransmission();    // stop transmitting

}

燒錄進去後,我們用邏輯分析儀看是不是真的有arduino Nano是否有送出命令,寫入資料到

位址0x00 0x00的地方。

寫入資料到AT24C256(二進制顯示)


(hex ASCII顯示)

這邊我們可以看到已經將命令及資料設定出去了,且資料的通訊格式與資料手冊一樣,接下來開始寫讀回資料的功能。

  

Step3 寫程式-讀回資料

要從AT24C256讀取資料時的通訊方式,其實有兩種方式,但我是使用下圖的方式,先告訴AT24C256我要讀取的資料位址,再進行讀取該位址的資料。



根據上面Step2的程式碼,替換成下面

#include <Wire.h>

#define DeviceAddress 0x50

 

void setup() {

  Wire.begin();

  Serial.begin(9600);

}

void loop() {

  Serial.println((char)I2C_read());//將讀回來的資料轉成char 型態,並從序列埠印出

  delay(1000);

}

unsigned char I2C_read()

{

  unsigned char re_char;

  Wire.beginTransmission(0x50); // transmit to device #8

  Wire.write(0x00);              // sends one byte

  Wire.write(0x00);              // sends one byte

  Wire.endTransmission();    // stop transmitting

  Wire.requestFrom(0x50,1);  //Send Read requestFrom

  if (Wire.available())re_char = Wire.read();

  return re_char;

}

 

void I2C_write(unsigned char data)

{

  Wire.beginTransmission(0x50); // transmit to device

  Wire.write(0x00);              // sends one byte

  Wire.write(0x00);              // sends one byte

  Wire.write(data);              // sends one byte

  Wire.endTransmission();    // stop transmitting

}

從邏輯分析儀讀到的資料


(二進制)


hex + ASCII

你可以在圖片中發現,讀取時控制讀寫的位元變成1,紅線處

參考資料

 

使用到的函式說明

WireBeginTransmission

https://www.arduino.cc/en/Reference/WireBeginTransmission

WireEndTransmission

https://www.arduino.cc/en/Reference/WireEndTransmission

WireRequestFrom

https://www.arduino.cc/en/Reference/WireRequestFrom

 

  

參考資料

Atmel 328P AU

https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

At24c256

https://ww1.microchip.com/downloads/en/DeviceDoc/doc0670.pdf

Arduino 資料

https://playground.arduino.cc/Code/I2CEEPROM/

https://www.arduino.cc/en/Tutorial/LibraryExamples/MasterWriter

    https://www.hobbytronics.co.uk/arduino-external-eeprom


  



2021年6月27日星期日

Arduino RS232

 RS232 with Arduino

 

今天來聊一下RS232這個介面,這個介面至今也還在工廠或是一些設備上可以發現,那不免除的還是要來了解一下歷史,根據網路上查到的資料,可以先從它的物理特性來認識。

 

RS232 介紹

RS-232是美國電子工業聯盟(EIA)制定的序列資料通訊的介面標準,它被廣泛用於電腦序列介面外設連接,像是早期電腦的ComportPLC 通訊或是現在的工業電腦也都還看的到。

那為甚麼工廠設備會喜歡使用RS232介面呢?

1.      電壓允許範圍: 訊號大小在正的和負的315v之間

2.      傳輸距離較ttl遠,約15米以內

 

雖然現在較多工廠開始轉成透過RJ45 或是無線的方式,為了方便擴充或布置,詳細的細節請看這裡https://zh.wikipedia.org/wiki/RS-232

 

電壓可以跟據電路設計,從3-15V之間,在有些場合或環境下,通訊間的電壓,提高,有助於避免通訊時被干擾。

 

常見的RS232 模組在使用時需要注意

1.      ttlRS232晶片型號

2.      該模組設計的電壓為多少

3.      支援的baudrate 到多少

4.      TxRx有沒有接對

RS232 通訊波形

這邊我先透過邏輯分析儀觀察TTL的波形,再用示波器觀察波形









(透過comport 發送’F’,在邏輯分析上得到的波形及結果)


(RS232 TX上面量測到的波形)


這邊可能會有人有疑惑波形怎麼不像,不過沒關係,透過示波器的反向功能就可以了















(反向完的結果與TTL的波形相同)


 材料

1.      USB RS232

2.      RS232 TTL

3.      Arduino NANO

4.      Arduino NANO 擴展版

5.      杜邦線若干條



 










軟體

1.      Arduino IDE

2.      Realtern

軟體載點連結

https://www.arduino.cc/en/software

https://sourceforge.net/projects/realterm/


 Realterm教學

安裝完後開啟

1.      點選port->找到USB to Rs232port

2.      設定通訊相關參數




 












3.      發送ASCII 文字

















實驗目標

        透過RS232 控制arduino NANO 上的 LED

 

Step1 了解模組晶片

先看一下晶片模組晶片的規格

 

晶片規格






















結論

1.      使用arduino 板子上的5V供電-OK

2.      BaudRate 不可以開超過120000


 

Step2、接線

接線說明

要注意有些模組的TX RX腳位沒有替換掉,如果照下面接線沒有反應,記得把TX pin RX Pin對調一下(ps因為我這個模組試完之後需要Rx Rx才有資料)

 

Arduino NANO

RS232 模組

5V

Vcc

D10

Rx

D11

Tx

Gnd

Gnd

這邊先說解說一下,可能有讀者覺得奇怪,D10D11不是數位腳位嗎?為甚麼可以接RS232模組的RxTx,原因是因為這是透過控制IO的輸出入控制來達到接收發送資料,細節下次再寫一篇跟大家分享。

Step3、寫程式

 

※測試接收發送

透過接收來自usb to RS232的資料並顯示在arduino comport

程式碼燒錄完後開啟arduino IDE COMPRTRealterm,在arduino IDE COMPORT丟資料可以顯示在Realterm上面,Realterm傳送資料可以顯示在arduino IDE COMPORT上。這邊沒有問題後才可以進到下一步。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

 

void setup()

{

  // Open serial communications and wait for port to open:

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for Native USB only

  }

  // set the data rate for the SoftwareSerial port

  mySerial.begin(9600);

}

 

void loop() // run over and over

{

  if (mySerial.available())

    Serial.write(mySerial.read());

  if (Serial.available())

    mySerial.write(Serial.read());

}


 測試結果照片,發送AAA,BBB測試






















※設定LED

void setup()裡面加入        pinMode(13,OUTPUT);

void setup()

{

  // Open serial communications and wait for port to open:

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for Native USB only

  }

  // set the data rate for the SoftwareSerial port

  mySerial.begin(9600);

 

  pinMode(13,OUTPUT);

}


 

※撰寫控制命令

        String cmd="";

void loop() // run over and over

{

  if (mySerial.available())

  {

    char recive = mySerial.read();

      Serial.write(Serial.read());

    if(recive=='\n')

    {

       if(cmd.equals("HIGH"))

        digitalWrite(13,HIGH);

       else if(cmd.equals("LOW"))

        digitalWrite(13,LOW);

      

       cmd="";

    }

    else

      cmd+=recive;

  }

  if (Serial.available())

    mySerial.write(Serial.read());

}

結果影片



 程式碼

https://github.com/windyman24/Arduino_RS232

 

參考資料

https://makerpro.cc/2019/08/the-difference-between-rs232-and-uart/

https://zh.wikipedia.org/zh-tw/RS-232

打賞按讚