Bo mạch Arduino có một số loại bộ nhớ. Đầu tiên, đó là RAM tĩnh (bộ nhớ truy cập ngẫu nhiên), dùng để lưu trữ các biến trong quá trình thực thi chương trình. Thứ hai, đó là bộ nhớ flash lưu trữ các bản phác thảo mà bạn đã viết. Và thứ ba, nó là một EEPROM có thể được sử dụng để lưu trữ thông tin vĩnh viễn. Loại bộ nhớ đầu tiên rất dễ bay hơi, nó mất tất cả thông tin sau khi khởi động lại Arduino. Hai loại bộ nhớ thứ hai lưu trữ thông tin cho đến khi nó được ghi đè bằng thông tin mới, ngay cả khi đã tắt nguồn. Loại bộ nhớ cuối cùng - EEPROM - cho phép dữ liệu được ghi, lưu trữ và đọc khi cần thiết. Chúng ta sẽ xem xét kỷ niệm này ngay bây giờ.
Cần thiết
- - Arduino;
- - máy vi tính.
Hướng dẫn
Bước 1
EEPROM là viết tắt của Electrically Erasable Programmable Read-Only Memory, tức là bộ nhớ chỉ đọc có thể xóa bằng điện. Dữ liệu trong bộ nhớ này có thể được lưu trữ hàng chục năm sau khi tắt nguồn. Số chu kỳ viết lại theo thứ tự vài triệu lần.
Số lượng bộ nhớ EEPROM trong Arduino khá hạn chế: đối với các bảng dựa trên vi điều khiển ATmega328 (ví dụ: Arduino UNO và Nano), số lượng bộ nhớ là 1 KB, đối với bảng ATmega168 và ATmega8 - 512 byte, đối với ATmega2560 và ATmega1280 - 4 KB.
Bước 2
Để làm việc với EEPROM cho Arduino, một thư viện đặc biệt đã được viết, được bao gồm trong IDE Arduino theo mặc định. Thư viện chứa các tính năng sau.
read (address) - đọc 1 byte từ EEPROM; address - địa chỉ nơi dữ liệu được đọc từ (ô bắt đầu từ 0);
write (address, value) - ghi giá trị value (1 byte, số từ 0 đến 255) vào bộ nhớ tại địa chỉ address;
cập nhật (địa chỉ, giá trị) - thay thế giá trị tại địa chỉ nếu nội dung cũ của nó khác với nội dung mới;
get (địa chỉ, dữ liệu) - đọc dữ liệu của kiểu được chỉ định từ bộ nhớ tại địa chỉ;
put (địa chỉ, dữ liệu) - ghi dữ liệu của kiểu được chỉ định vào bộ nhớ theo địa chỉ;
EEPROM [địa chỉ] - cho phép bạn sử dụng mã định danh "EEPROM" như một mảng để ghi và đọc dữ liệu từ bộ nhớ.
Để sử dụng thư viện trong bản phác thảo, chúng tôi đưa nó vào với lệnh #include EEPROM.h.
Bước 3
Hãy ghi hai số nguyên vào EEPROM và sau đó đọc chúng từ EEPROM và xuất chúng ra cổng nối tiếp.
Không có vấn đề gì với các số từ 0 đến 255, chúng chỉ chiếm 1 byte bộ nhớ và được ghi vào vị trí mong muốn bằng cách sử dụng hàm EEPROM.write ().
Nếu số lớn hơn 255, thì khi sử dụng toán tử highByte () và lowByte (), nó phải được chia theo từng byte và mỗi byte phải được ghi vào ô riêng của nó. Con số tối đa trong trường hợp này là 65536 (hoặc 2 ^ 16).
Hãy xem, bộ giám sát cổng nối tiếp trong ô 0 chỉ hiển thị một số nhỏ hơn 255. Trong ô 1 và 2, một số lớn 789. Trong trường hợp này, ô 1 lưu trữ hệ số tràn 3 và ô 2 lưu trữ số 21 bị thiếu (tức là 789 = 3 * 256 + 21). Để tập hợp lại một số lớn, được phân tích cú pháp thành từng byte, có hàm word (): int val = word (hi, low), trong đó hi và low là giá trị của các byte cao và thấp.
Trong tất cả các ô khác mà chúng tôi chưa bao giờ viết ra, số 255 được lưu trữ.
Bước 4
Để viết chuỗi và số dấu phẩy động, hãy sử dụng phương thức EEPROM.put () và để đọc, hãy sử dụng EEPROM.get ().
Trong thủ tục setup (), đầu tiên chúng ta viết số dấu phẩy động f. Sau đó, chúng ta di chuyển theo số lượng ô nhớ mà kiểu float chiếm và viết một chuỗi ký tự có dung lượng 20 ô.
Trong thủ tục loop (), chúng ta sẽ đọc tất cả các ô nhớ và cố gắng giải mã chúng trước tiên là kiểu "float", sau đó là kiểu "char" và xuất kết quả ra cổng nối tiếp.
Bạn có thể thấy rằng giá trị trong các ô từ 0 đến 3 đã được xác định chính xác dưới dạng số dấu phẩy động và bắt đầu từ số 4 - dưới dạng một chuỗi.
Các giá trị kết quả ovf (tràn) và nan (không phải số) cho biết rằng số không thể được chuyển đổi chính xác thành số dấu phẩy động. Nếu bạn biết chính xác loại dữ liệu mà các ô nhớ đang chiếm giữ, thì bạn sẽ không gặp bất kỳ vấn đề nào.
Bước 5
Một tính năng rất tiện lợi là tham chiếu đến các ô nhớ như các phần tử của một mảng EEPROM. Trong bản phác thảo này, trong thủ tục setup (), đầu tiên chúng ta sẽ ghi dữ liệu vào 4 byte đầu tiên và trong thủ tục loop (), cứ mỗi phút, chúng ta sẽ đọc dữ liệu từ tất cả các ô và xuất chúng ra cổng nối tiếp.