페이지

글목록

2017년 2월 15일 수요일

[ESP8266] MAC Address 읽기

MAC Address 읽는 함수로 ESP-8266 IC 내부의 2가지 MAC Address 를 읽을 수 있습니다.
참고한 사이트 주소는 다음과 같습니다.
http://www.esp8266.com/viewtopic.php?f=29&t=3587


아직 네트웍 개념이 없어서 잘은 모르겠지만,
1개는 일반 맥 어드레스이고(MAC{STA]) , 또 하나는 Wifi 단독 Server ?(MAC[SOFTAP]) 용 MAC Address 입니다.

Soft AP 는 공유기에 붙이지 않고, 8266가 단독으로 SSID,Password 를 치고 연결할 때
사용하는 방식 으로 알고 있습니다. 
그 뭐시냐... 핸드폰으로 Wifi 스캔하면 SSID가 보이죠. (^^ 공부 좀 더 해야겠네요.)

자 나중에 공부 더 해서 추가할께요.
아뭏든, 아두이노 IDE 에서 스케치 소스 코드만 있으면 실험 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <ESP8266WiFi.h>
 
uint8_t MAC_array[6];
char MAC_char[18];
 
 
void setup() {
  char ser_tx_buff[100];
  
  Serial.begin(115200);
 
  Serial.println();
  // put your setup code here, to run once:
 
  Serial.print("MAC[STA] ->");
  WiFi.macAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
 
  MAC_char[0]=0;
  Serial.print("MAC[SOFTAP] ->");
  WiFi.softAPmacAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
}
 
void loop() {
  // put your main code here, to run repeatedly:
}
cs

[ESP8266] Chip Information 읽기

원래는 Chip ID 만 알려고 했다가,
구글링을 해 보니, 더 많은 정보를 얻을 수 있었습니다.

다음 사이트에서 참고했습니다.
https://github.com/adafruit/ESP8266-Arduino

그냥 스케치 프로그램만 건드리면 되네요.

소스 코드는 다음과 같습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void setup() {
  char ser_tx_buff[100];
  
  Serial.begin(115200);
 
  Serial.println();
//ESP.getFreeHeap();// returns the free heap size.
//ESP.getChipId();// returns the ESP8266 chip ID as a 32-bit integer.
//Several APIs may be used to get flash chip info:
//ESP.getFlashChipId();// returns the flash chip ID as a 32-bit integer.
//ESP.getFlashChipSize();// returns the flash chip size, in bytes, as seen by the SDK (may be less than actual size).
//ESP.getFlashChipSpeed();// returns the flash chip frequency, in Hz.
//ESP.getCycleCount();// returns the cpu instruction cycle count since start as an unsigned 32-bit. This is useful for accurate timing of very short actions like bit banging.
  sprintf(ser_tx_buff,"1. getFreeHeap = %d\n\r",ESP.getFreeHeap());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"2. getChipId = %d\n\r",ESP.getChipId());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"3. getFlashChipId = %d\n\r",ESP.getFlashChipId());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"4. getFlashChipSize = %d\n\r",ESP.getFlashChipSize());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"5. getFlashChipSpeed = %d\n\r",ESP.getFlashChipSpeed());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"5. getCycleCount = %d\n\r",ESP.getCycleCount());
  Serial.print(ser_tx_buff);
  // put your setup code here, to run once:
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
cs

[ESP8266] SPI 통신 테스트 (ARDUINO IDE)

SPI 통신 테스트를 하려고 보니까, 
함수가 크게 2가지로 나눠서 볼 수 있는데, 특히 transferBytes(uint8_t * out, uint8_t * in, uint32_t size)함수는 
설명을 읽어 보아도 잘 모르겠어서 직접 테스트를 해 보게 되었습니다.

먼저 2가지라고 말씀 드린 함수는 대표적으로 다음과 같습니다.
PC의 다음 위치의 SPI.CPP 파일에 정의되어 있습니다.
C:\Users\trion\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\SPI
1. void SPIClass::transferBytes(uint8_t * out, uint8_t * in, uint32_t size)
2. void SPIClass::writeBytes(uint8_t * data, uint32_t size)

관련된 비슷하거나 파생된 함수는 몇가지 더 있습니다만, 이 2가지 함수가 많은 데이터를 보내면서
테스트하기에 적합해서 2가지 함수로 테스트를 진행했습니다.

하드웨어 구성은 예전에 테스트하다가 중단하고 그냥 놔둔 Serial Nand Flash IC(W25N01GxxIG)를 사용해서
ESP-8266의 HSPI 포트에 연결했습니다. 얼마 전까지 SD-Card 를 연결했던 포트죠.


[ESP-8266 개발 키트에서 사용한 SPI 포트들] 


NAND 랑 연결을 하고 테스트를 크게 2가지로 진행했습니다.
1. 10 바이트 전송.
  - writeBytes() 함수와 transferBytes() 함수의 차이점은 읽기가 되는지 안되는지의 차이 입니다.
    transferBytes() 함수로도 쓰기 기능만 사용할 수 있고 writeBytes() 함수가 약간 더 빠름니다.
  - 쉽게 말하면, writeBytes() 함수는 Write 전용, transferBytes() 함수는 Full Duplex 통신이라고 볼 수 있다.
  - 다음의 그림은 writeBytes() 함수와 읽기/쓰기 겸용(Full Duplex)으로 사용한 transferBytes() 함수의 전송속도 차이를 보여주는 신호 파형이다.



 2. 100 바이트 전송.
다음은 이 2개의 함수에서 대용량 바이트를 전송할 경우의 특성을 살펴 보았다.
여러 바이트를 전송할 경우에, ESP IC는 기본으로 다른 칩에서의 DMA 기능처럼 SCLK가 끊어짐 없이 출력되었다.
하지만 64-Byte 마다 약간의 딜레이가 있다. 
이 딜레이는  transferBytes() 함수에서 읽기 기능을 사용했을 경우 크게 늘어난다. 
읽기 기능을 사용하지 않으면 두 함수의 64 Byte 간의 딜레이의 차이는 별로 없다.
[transferBytes() 함수의 특성]



 [writeBytes() 함수의 특성]



다음은 아두이노 IDE 툴에서 사용한 프로그램 소스 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <Arduino.h>
#include "SPI.h"
#include "HardwareSerial.h"
#define nSPI_CS   4
void setup() {
  int i;
  uint8_t in_buf[100],out_buf[100];
  char ser_tx_buf[100];
  
  delay(1000);
  
  Serial.begin(115200);
  // put your setup code here, to run once:
  digitalWrite(nSPI_CS, HIGH);
  pinMode(nSPI_CS, OUTPUT);
  pinMode(SCK, SPECIAL);  ///< GPIO14
  pinMode(MISO, SPECIAL); ///< GPIO12
  pinMode(MOSI, SPECIAL); ///< GPIO13
  SPI1C = 0;
  SPI.setFrequency(20000000); ///< 20MHz
  SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
  SPI1U1 = (7 << SPILMOSI) | (7 << SPILMISO);
  SPI1C1 = 0;
  for (i=0;i<10;i++)
  {
    out_buf[i] = i;
  }
    out_buf[0= 0x9F;
    out_buf[1= 0;
    out_buf[2= 0;
    out_buf[3= 0;
    out_buf[4= 0;
    
  digitalWrite(nSPI_CS, LOW);
  // 10 Byte Transfer
  //SPI.transferBytes(out_buf,in_buf,10);
  //SPI.writeBytes(out_buf,10);
  // 100 Byte transfer
  //SPI.transferBytes(out_buf,in_buf,100);
  //SPI.transferBytes(NULL,NULL,100);
  //SPI.transferBytes(out_buf,NULL,100);
  //SPI.transferBytes(NULL,in_buf,100);
  SPI.writeBytes(out_buf,100);
  digitalWrite(nSPI_CS, HIGH);
  sprintf(ser_tx_buf,"\n\nSPI Test Program in:%02X,%02X,%02X,%02X,%02X\n\r",in_buf[0],in_buf[1],in_buf[2],in_buf[3],in_buf[4]);
  Serial.print(ser_tx_buf);
}
void loop() {
  // put your main code here, to run repeatedly:
}
cs

2017년 2월 14일 화요일

PCB 10조각에 만원? 중국 회사.

100 mm x 100 mm PCB를 10조각에 $10에 제작해 준다고 합니다.

간혹 인터넷에서 이런 곳을 이용하는 사람들을 봤었는데,
요새 Windows 10으로 바꾸고 나서 orcad Layout을 느려서 못 쓰니까 PSB 아트웍을 안하게 되네요.

알레그로 좀 공부해서 한 번 맡겨봐야 겠습니다.



2017년 2월 13일 월요일

[ESP-8266] 저장된 SSID/Password 지우기 (Arduino IDE)

어디서 저장이 된 것인지 잘 모르겠지만,
SSID 와 Password가 저장되어서 지우고 싶을 때가 있다.

그럴 땐, 이렇게.. (ARDUINO IDE 에서 사용하는 함수이다.)

WiFi.disconnect();

[PSOC5] EEPROM 테스트

PSOC5 는 EEPROM 테스트 관련 글이 없어서 약간 시간을 내서 글을 올려 봅니다.

물론 예제에서도 참고할 수 있는데, 예제가 너무 복잡해 보이네요.
또한 제가 사용할 때는, EEPROM 을 따로 Erase를 할 필요가 없었는데.. 
예제에서는 항상 Erase를 하고 Write를 하는게 좀 이상했습니다.

이번에 테스트한 보드는, Cypress에서 많이 파는 CY8CKIT-059 로 진행했습니다.
사용한 콤포넌트는 Port 입력 1개(TACT Switch)와 UART 만 사용했습니다.

byte(unsigned char) 타입 데이터 2개와 uint(unsigned 16 bit) 타입 데이터 2개를 스위치를 1번 누를 때마다,
1씩 증가하도록 하고 EEPROM 에 저장을 했습니다.
그리고 리셋 버튼을 누르면 EEPROM에 저장된 값을 UART 로 출력해서 EEPROM의 동작을 확인했습니다.

보드의 외형과 사용하는 포트들은 다음과 같습니다.



다음은 PSOC Creeator 의 컴포넌트 설계도입니다. (TopDesign.cysch)


다음은 실제 PSOC5 IC의 사용하는 포트입니다.



다음은 프로그램 테스트 과정입니다.

1. 처음 프로그램을 다운로드하고 UART 로 출력되는 내용 (EEPROM에 저장되는 값들을 초기화하여 Write 한다)



2. 스위치를 3번 눌러서 값을 3증가시켜서 저장하고 UART로 출력. 리셋 버튼을 눌러 EEPROM 값을 읽어 확인.



3. 전원을 OFF --> ON 해서 정말로 데이터가 남아 있는지도 확인.


psoc 소스 코드 첨부합니다.

2017년 2월 12일 일요일

[전원 분리제어] #7. 전원 분리 후 전류 싱크 입력(수위 센싱)

이번에 테스트 한 접촉식 수위 센서를 구현해 봤습니다.

물을 감지하면 LED가 켜지는 구조이고 감지가 잘 됩니다. 첨 해 본 건데, 나중에 문제 생기면 후기 올리겠습니다.
요새는 비접촉식 수위 측정 센서들이 조금씩 나오는 듯 한데, 자신 없으면 접촉식.. 
아직 확실한 비접촉식 센서는 없는듯 보입니다.



[전원 분리제어] #6. 전원 분리 후 전류 싱크 입력 기본 회로 및 접점 입력

전원 분리된 24V DC 쪽 접점 입력 회로입니다.

요새는 소자들이 좋아져서 옛날 회로 처럼 복잡하게 구성하지 않아도 되는 것 같습니다.
전 옛날 회로 이해도 못해서 그냥 최신 소자랑 레퍼런스 회로 참고해서 구현했습니다.

지금까지 모두 동작 잘되는 것은 확인했습니다. ^^



[전원 분리제어] #5. 전원 분리 후 전류 소싱 출력(대전력 AC ON/OFF 제어)

대전력 아마 이 트라이악 소자가 30A 까지 가능 한가 그럴겁니다. 
하지만 제가 감이 안와서 방열판을 얼마나 크게 해야 할지, 회로 패턴 굵기는 얼마로 할지  몰라서 10A 미만 정도로 예상합니다.

원래는 5KW 전열기를 직접 제어 하려고 했는데 자신이 없어서.. ^^


[전원 분리제어] #4. 전원 분리 후 전류 소싱 출력(소전력 AC)

이 회로는 소전력 AC 로드(솔밸브,마그네틱 스위치,릴레이)에 사용 가능 합니다.

ISOLATE FET 드라이브만한데, 최대 900mA 까지 출력이 되서 쓰임새가 많을 것 같습니다. ^^


[전원 분리제어] #3. 전원 분리 후 전류 소싱 출력(24V 모터 제어)

얼마 전에 올린 회로인데 다시 전력제어 시리즈니까 ^^ 

아, 참.. 이 회로는 아직 테스트 안해봤으니 해 보고 후기를 올리겠습니다.


[전원 분리제어] #2. 전원 분리 후 전류 소싱 출력 (DC 출력)

이전에 올린 글의 기본 회로에 붙여서 사용하면 DC 출력이 되는 회로입니다.

부저,릴레이,기타 등등으로 소량의 전류를 사용하는 부하에 사용 가능합니다.
앞단의 TR의 스펙을 올리면 좀 더 큰 전력 제어도 가능합니다.


[전원 분리제어] #1. 전원 분리 후 전류 소싱 출력 기본회로

안녕하세요, 저는 전원 분리를 노이즈가 있거나 환경이 열악한 상황에서 중요한 콘트롤 장치를 보호 하려고 사용했습니다.

외부 전력제어 소자들에 의해서 , 특히 모터가 있고 온도 센싱도 열전대를 사용하는 바람에 20비트 ADC 를 써야하니 
노이즈가 커지면 치명적일겁니다.
그렇게 ADC를 해도 노이즈가 많아 디지탈 필터를 프로그램으로 해 넣어야 안정적으로 데이터를 뽑아 낼 수 있었습니다.

제가 우선 전력전자 전공은 아니라서, 여차저차 구글링해서 디지키에서 최근 나온 소자로 회로를 설계해서 
테스트를 해 보고 올려 봅니다.

MCU 전원은 24V 에서 DCDC-CONVERTER 로 5V (400mV)를 만들어서 썼고,
이렇게 분리된 전원으로 24V 쪽에 붙어 있는 DC-Motor,부저,릴레이를 출력으로 제어 했습니다.
입력으로 분리된 24V 로 물에 전기를 통하게 하여 접촉식 수위 센서를 구현했고, 접점입력 들을 구현했습니다.
그리고 제가 좀 약한 대전력 제어인데, 게다가 AC220V 제어입니다.
솔벨브나 마그네틱 스위치는 용량이 얼마 안되서 AC220V,900mA 를 출력할 수 있는 트라이악이 단일 소자로 나와서 간단했습니다.
여기서 5KW 전열기를 제어하는 소자는 자신이 없어서 마그네틱 스위치로 제어했습니다.
그리고 조금 대전력으로 볼 수 있는 1KW 급 약간 못 되는 AC모터는 대용량 트라이악으로 제어를 했습니다.

이 (출력)제어 대상의 기본이 되는 것이 전원 분리 후, 전류를 소싱하는 회로입니다.
(한번에 다 쓰 면 가독성과 찾기가 불편에서 글이 짧아도 이해 바랍니다.)

기본 회로는 다음과 같습니다. 이 출력에 붙이는 회로에 따라 여러가지가 나옵니다.


[ESP8266] SD-Card(SPI-mode) 핀/스피드 설정

아두이노 IDE 툴의 스케치 프로그램에서 SD-Card 설정은 다음의 함수로 설정 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
boolean SDClass::begin(uint8_t csPin, uint32_t speed) {
  /*
    Performs the initialisation required by the sdfatlib library.
    Return true if initialization succeeds, false otherwise.
   */
  return card.init(speed, csPin) &&
         volume.init(card) &&
         root.openRoot(volume);
}
cs
이전에 Ftp 서버 스케치 프로그램의 void setup(void) 함수 내에서, 다음과 같이 사용했다.
1
2
3
4
  if (SD.begin(4)) {
      Serial.println("SD opened!");
      ftpSrv.begin("esp8266","esp8266");    //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
  }    
cs

즉 MISO,MOSI,SCLK 는 HSPI 포트들을 사용하므로 고정되어 있으므로, CS 핀만 따로 지정해 주면 된다.
현재 위의 소스코드에서 Clock Speed는 사용하지 않았는데, 파라메터를 넣지 않으면 디폴트값이 들어간다.
하지만, 디폴트 값이 얼만지는 잘 모르겠다.
GPIO 4번핀을 CS핀으로 사용하고, Clock speed는 기본이다.

가령, SD.begin(4,40000000) 라고 하면 GPIO 4번핀을 CS핀으로 사용하고, Clock speed는 40MHz 이다.
최대 클럭 스피드는 시스템 클럭의 /2 이다.

[IC 소개] 싸고 간단한 DC Motor Driver IC 2 (DRV8871)

지난 번에 소개해 드린 모터 드라이버는 PCB 를 떠야 동작을 할 수 있어서,
시중에서 Brake 보드로 파는 더 간단한 모터 드라이브를 소개합니다.

DRV8871 은 전류 제한용 저항이 달려 있는데, 
지난번에 소개해 드린 MC34931 은 FB 신호를 보고 콘트롤러에서 직접 제어를 해야 합니다.

저한테는 모터 정역 ON/OFF 제어만을 하기 때문에, DRV8871 이 더 간단하고 좋네요.

최대 구동 전류는 차이가 있지만, DRV8871 이  가격도 더 저렴합니다. (디지키 가격)
1. MC34931(MAX 5A) : $1.944 @ 1K
2. DRV8871(MAX 3.6A) : $1.2125 @ 1K


핀수는 8핀으로 패키지는 SOIC-8P 입니다.



회로 구성은 다음과 같습니다.


쇼핑몰에서 파는 쪽보드인데, 원가의 5배 이상 받는 것 같습니다. ^^
파는 곳 링크입니다. (10,900 원 입니다.)


제가 회로를 잘 못 설계하는 바람에 이 보드를 사용하게 됐는데, 이 보드(IC)의 디지탈 신호 입력 전압은 MAX(7V) 이기 때문에,
현재 24V 로 되어 있는 입력을 저항으로 분주해서 약 4.2V로 낮췄습니다.



회로를 보드에 붙여 연결한 모습입니다.


[ESP8266] WiFi FTP Server with SD-Card[5] (속도 개선)

esp8266 FTP 서버의 전송 속도를 개선하는 방법을 여러가지 찾아보고 적용해 봤습니다.

전송 속도에 관련된 사항은 다음과 같습니다. 
1. WIFI FTP BUFFER 의 크기 : ESP8266FtpServer.h 파일에 FTP_BUF_SIZE 로 정의가 되어 있는데,
   크기가 기본으로 1024 // 512 로 설정되어 있는데 이 설정으로는 너무 느리다.
   512 로 9KB/s , 1024로 18KB/s 밖에 안나온다.
   하지만 이 크기를 1460 의 배수인 1460*2 로 바꾸면 460KB/s 의 속도가 나온다. 
   이 속도는 SD-Card에서 읽어서 PC로 전송하는 속도이고, SPI Single 방식의 SD-Card Write 시에는 약 86KB/s 가 나온다.
   즉, SD 카드를 읽는 데는 엄청 빠른데, 쓸 때는 SPI Single 에다가 Write 할 동안 기다려야 하므로 아주 느리다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <SPI.h>
#include <SD.h>
//#include <FS.h>
#include <WiFiClient.h>
#define FTP_SERVER_VERSION "FTP-2016-01-14"
#define FTP_CTRL_PORT    21       // Command port on wich server is listening  
#define FTP_DATA_PORT_PASV 50009  // Data port in passive mode
#define FTP_TIME_OUT  5      // Disconnect client after 5 minutes of inactivity
#define FTP_CMD_SIZE 255 + 8 // max size of a command
#define FTP_CWD_SIZE 255 + 8 // max size of a directory name
#define FTP_FIL_SIZE 255     // max size of a file name
//#define FTP_BUF_SIZE 1024 //512   // size of file buffer for read/write
#define FTP_BUF_SIZE 2*1460
cs

2. CPU Clock 속도 Up : 80MHz 에서 160MHz 로 올리면 조금 더 빨라진다. 
3. SPI CLK 속도 UP : 현재 24MHz 까지 올렸는데 50MHz 까지 올려 볼 예정이다.
  이 과정은 선 길이에 영향을 많이 받기 때문에, PCB가 나와봐야 알 수 있을 것이다.


버퍼 크기는 1460 배수가 아니면 속도 차가 읽기 모드에서 최대 51배나 차이가 납니다.
쓰실 때, 꼭 알아두세요. ^^

다음은 FTP 서버에서 PC로 전송시 속도를 동영상으로 찍어 봤습니다.


[ESP8266] WiFi FTP Server with SD-Card[4] (디렉토리 읽기 개선)

ESP8266 FTP 서버에서 파일을 전송을 하던지 PC에서 FTP 서버로 전송을 하면
ESP8266 의 디렉토리가 몇개씩 사라지는 현상이 있어서 원인을 한참 찾다가 고쳐졌습니다.

정확한 원인은 잘 모르겠고, SD Card 에서 디렉토리를 읽어서 보여줄 때,
함수를 1개(rewindDirectory) 더 추가해야 이 현상이 없어졌습니다.

어쩌면 SPIFFS 메모리에서는 이런 현상이 안나타날 지도 모르겠습니다.
제가 SPIFFS 메모리로 된 FTP 서버 프로그램을 SD 카드용으로 바꿔서 여러가지 오동작이 많이 발생하는 것 같습니다.

FTP 서버에서 디렉토리를 새로고치는 명령이 "MLSD" 이므로 
ESP8266FtpServer.ccp 의 processCommand 함수에서 "MLSD" 명령을 처리하는 부분을 수정하면 됩니다.
수정한 코드는 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  //
  //  MLSD - Listing for Machine Processing (see RFC 3659)
  //
  else if! strcmp( command, "MLSD" ))
  {
    if! dataConnect())
      client.println( "425 No data connection MLSD");
    else
    {
      client.println( "150 Accepted data connection");
      uint16_t nm = 0;
 
      File dir=SD.open(cwdName);
      File entry;
 
      dir.rewindDirectory();
          
      char dtStr[ 15 ];
 
        while(1)
        {
            entry =  dir.openNextFile();
            if (!entry)
                break;
            String fn,fs;
            fn = entry.name();
            fs = String(entry.size());
              data.println( "Type=file;Size=" + fs + ";"+"modify=20000101160656;" +" " + fn);
              nm ++;
        }
        client.println( "226-options: -a -l");
        client.println( "226 " + String(nm) + " matches total");
      }
      data.stop();
      entry.close();
  }
cs

SD.open() 함수 다음에 rewindDirectory(); 함수를 사용하면 됩니다.

[ESP8266] 아두이노 자주 쓰는 함수 및 문법 링크

다음의 링크로 가면 아두이노 IDE 툴에서 사용하는 일반적인 함수와 문법에 관한 내용들이 있다.

사용한지 얼마 안되서, 좀 생소하군요,. ^^

[ESP8266] EEPROM Test (Arduino IDE)

ESP8266 에서 EEPROM 은 실제로는 없고 외부에 있는 SPIFF 플래쉬 메모리의 일부를 사용하는 것이다.

EEPROM 을 다루는 함수들은 Library 에 있는 EEPROM.cpp 에 정의되어 있다.
라이브러리 소스의 위치는 다음과 같다.
C:\Users\trion\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\EEPROM

함수들의 종류는 다음과 같다.
1. void EEPROMClass::begin(size_t size)
   : 예를 들어 아두이노 스케치 코드에서 begin.EEPROM(512); 라고 코딩을 하면, EEPROM 을 512바이트 할당하고,
     EEPROM 관련 항목들을 초기화한다.
2. uint8_t EEPROMClass::read(int address)
   : 위에서 예를 든 begin 함수와 같이 설명하자면, 어드레스 0~511 까지 512개의 바이트 데이터를 해당 주소에서 읽어 올 수 있다.
3. void EEPROMClass::write(int address, uint8_t value)
   : 해당 주소(address)에 값을 쓴다. 이 때, 실제로 EEPROM에 물리적으로 기록되는 것이 아니고,
     램으로 된 버퍼값을 바꾸는 것이다.
4. bool EEPROMClass::commit()
   : 실제로 물리적으로 EEPROM(외부 플래쉬 메모리)에 값을 기록해서 리셋이나 전원이 꺼져도 값을 유지할 수 있다.

다음은 아두이노 IDE 툴에서 EEPROM 을 테스트한 코드 입니다.
: NODE MCU V3.0 보드의 Flash 버튼을 누르면 EEPROM 의 0번 어드레스의 값의 0번 비트가 토글 되면서,
  값을 기록하고 소프트웨어 리셋을 이용하여 리셋을 한 후,
  EEPROM의 0번 어드레스의 값이 바뀌어 있는지 EEPROM을 읽어서 시리얼 포트에 출력해 본 테스트입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <EEPROM.h>
 
const int buttonPin = 0;     // the number of the pushbutton pin
int buttonState = 0,buttonState_old=0;         // variable for reading the pushbutton status
byte value;
 
void setup() {
  // put your setup code here, to run once:
  delay(1000);
  Serial.begin(115200);
  EEPROM.begin(512);
  pinMode(buttonPin, INPUT);
  value = EEPROM.read(0);
  Serial.println("");
  Serial.print("EEPROM value = ");
  Serial.println(value,HEX);
 
  buttonState_old = buttonState = digitalRead(buttonPin);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  buttonState_old = buttonState;
  buttonState = digitalRead(buttonPin);
  if (buttonState_old != buttonState)
  {
    if (buttonState == LOW) 
    {
      value = EEPROM.read(0);
      value ^= 1;
      EEPROM.write(0, value);
      EEPROM.commit(); 
      Serial.print("Button Pressed !, EEPROM value = ");
      Serial.println(value,HEX);
      Serial.println("ESP8266 Software Reset");
      ESP.reset();
    }
  }
 
}
cs


다음은 위의 ESP8266 아두이노 IDE 스케치 코드에의해 디버그용으로 시리얼에 표시한 내용 입니다.