Просмотр исходного кода

Added 1306 + pin config in same file

Thomas Chef 3 лет назад
Родитель
Сommit
996c2bbafd
7 измененных файлов с 184 добавлено и 7 удалено
  1. 2 1
      main/CMakeLists.txt
  2. 13 4
      main/config.h
  3. 6 0
      main/main.c
  4. 1 1
      main/pcnt_functions.c
  5. 104 0
      main/ssd1306.c
  6. 57 0
      main/ssd1306.h
  7. 1 1
      main/uart.c

+ 2 - 1
main/CMakeLists.txt

@@ -1,4 +1,5 @@
-idf_component_register(SRCS "http_client.c" "mqtt.c" "wifi.c"
+idf_component_register(SRCS "ssd1306.c" "http_client.c" "mqtt.c" "wifi.c"
 "pcnt_functions.c" "main.c" "led_test_inout.c"
 "pcnt_functions.c" "wifi.c" "mqtt.c" "uart.c" "serial.c"
+"ssd1306.c"
                     INCLUDE_DIRS "")

+ 13 - 4
main/config.h

@@ -6,9 +6,18 @@
 //#define CCFG_PCNT           // pcnt-code that counts pulses
 //#define WIFI_ENABLED
 //#define MQTT_ENABLED
-#define SERIAL_ENABLED
+//#define SERIAL_ENABLED
+#define ENABLE_SSD1306
 
 
-#define PCNT_INPUT_SIG_IO   4  // Pulse Input GPIO
-#define PCNT_INPUT_CTRL_IO  5  // Control GPIO HIGH=count up, LOW=count down
-#define LEDC_OUTPUT_IO      18 // Output GPIO of a sample 1 Hz pulse generator
+// Pulse
+#define PCNT_INPUT_SIG_IO   GPIO_NUM_6  // Pulse Input GPIO
+#define LEDC_OUTPUT_IO      GPIO_NUM_7  // Output GPIO of a sample 1 Hz pulse generator
+
+// I2C OLED Disp
+#define I2C_SDA_PIN         GPIO_NUM_5
+#define I2C_CLK_PIN         GPIO_NUM_4
+
+// UART
+#define UART_TX_PIN         GPIO_NUM_17
+#define UART_RX_PIN         GPIO_NUM_16

+ 6 - 0
main/main.c

@@ -13,6 +13,7 @@
 #include "wifi.h"
 #include "uart.h"
 #include "serial.h"
+#include "ssd1306.h"
 
 // Externs
 extern void ledc_init(void);
@@ -55,6 +56,11 @@ void app_main(void)
     xTaskCreate(serialRxTask, "Serial_RX_Task", 10000, NULL, 10, NULL);
 #endif
 
+#ifdef ENABLE_SSD1306
+    i2c_master_init();
+    oled_ssd1306_init();
+#endif
+
     char dataStr[100];
     double kWh = 0.0;
     uint32_t bigCnt = 0;

+ 1 - 1
main/pcnt_functions.c

@@ -46,7 +46,7 @@ void init_pcnt_unit()
     pcnt_config_t pcnt_config = {
         // Set PCNT input signal and control GPIOs
         .pulse_gpio_num = PCNT_INPUT_SIG_IO,
-        .ctrl_gpio_num = PCNT_INPUT_CTRL_IO,
+        .ctrl_gpio_num = PCNT_PIN_NOT_USED;
         .channel = PCNT_CHANNEL_0,
         .unit = pcntUnit,
         // What to do on the positive / negative edge of pulse input?

+ 104 - 0
main/ssd1306.c

@@ -0,0 +1,104 @@
+#include "ssd1306.h"
+
+#include "esp_log.h"
+
+#include "driver/gpio.h"
+#include "driver/i2c.h"
+#include <driver/gpio.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "freertos/queue.h"
+#include "freertos/task.h"
+
+#include "config.h"
+
+#ifdef ENABLE_SSD1306
+
+
+esp_err_t oled_ssd1306_init() {
+
+    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
+    i2c_master_start(cmd);
+
+    i2c_master_write_byte(cmd, (SSD1306_OLED_ADDR << 1) | WRITE_BIT, ACK_CHECK_EN);
+
+    // Initialization (page 64)
+    // The next bytes are commands
+    i2c_master_write_byte(cmd, COMMAND_MODE, ACK_CHECK_EN);
+
+    // Mux Ratio
+    i2c_master_write_byte(cmd, MULTIPLEX_RATIO, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x3F, ACK_CHECK_EN);
+
+    // Set display offset
+    i2c_master_write_byte(cmd, DISPLAY_OFFSET, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
+
+    // Set display line start
+    i2c_master_write_byte(cmd, DISPLAY_LINE_START, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
+
+    // Set Segment re-map
+    i2c_master_write_byte(cmd, SEGMENT_REMAP, ACK_CHECK_EN);
+
+    // Set COM output scan dir
+    i2c_master_write_byte(cmd, COM_OUTPUT_SCAN_DIR, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
+
+    // Set COM pins hardware config
+    i2c_master_write_byte(cmd, COM_PINS_HARDWARE_CONFIG, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x12, ACK_CHECK_EN);
+
+    // Set contrast Control
+    i2c_master_write_byte(cmd, CONTRAST_CONTROL, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x7F, ACK_CHECK_EN);
+
+    // Disable entire display ON
+    i2c_master_write_byte(cmd, DISABLE_ENTIRE_DISPLAY, ACK_CHECK_EN);
+
+    // Set normal display
+    i2c_master_write_byte(cmd, NORMAL_DISPLAY, ACK_CHECK_EN);
+
+    // Set OSC frequency
+    i2c_master_write_byte(cmd, DISPLAY_CLK_RATIO, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x80, ACK_CHECK_EN);
+
+    // Enable charge pump regulator
+    i2c_master_write_byte(cmd, CHARGE_PUMP_SET, ACK_CHECK_EN);
+    i2c_master_write_byte(cmd, 0x14, ACK_CHECK_EN);
+
+    // Display on
+    i2c_master_write_byte(cmd, DISPLAY_ON, ACK_CHECK_EN);
+
+    // Stop bit
+    i2c_master_stop(cmd);
+
+    esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
+    i2c_cmd_link_delete(cmd);
+
+    return ret;
+}
+
+
+
+
+void i2c_master_init() {
+
+    int i2c_master_port = I2C_MASTER_NUM;
+    i2c_config_t conf;
+
+    conf.mode = I2C_MODE_MASTER;
+    conf.sda_io_num = I2C_SDA_PIN;               // Data pin
+    conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
+    conf.scl_io_num = I2C_CLK_PIN;               // Clock pin
+    conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
+    conf.master.clk_speed = 100000;
+    i2c_param_config(i2c_master_port, &conf);
+    i2c_driver_install(i2c_master_port,
+                        conf.mode,
+                        I2C_MASTER_RX_BUF_DISABLE,
+                        I2C_MASTER_TX_BUF_DISABLE,
+                        0);
+}
+
+#endif

+ 57 - 0
main/ssd1306.h

@@ -0,0 +1,57 @@
+#ifndef __SSD1306_H__
+#define __SSD1306_H__
+
+#include <driver/spi_master.h>
+
+
+void i2c_master_init();
+esp_err_t oled_ssd1306_init();
+
+
+// I2C CONFIG
+#define I2C_MASTER_NUM    I2C_NUM_1             /*!< I2C port number for master dev */
+#define I2C_MASTER_TX_BUF_DISABLE   0           /*!< I2C master do not need buffer */
+#define I2C_MASTER_RX_BUF_DISABLE   0           /*!< I2C master do not need buffer */
+
+#define SSD1306_OLED_ADDR  0x3C                 /*!< slave address for ssd1306 oled display */
+#define WRITE_BIT  I2C_MASTER_WRITE             /*!< I2C master write */
+#define READ_BIT   I2C_MASTER_READ              /*!< I2C master read */
+#define ACK_CHECK_EN   0x1                      /*!< I2C master will check ack from slave*/
+#define ACK_CHECK_DIS  0x0                      /*!< I2C master will not check ack from slave */
+#define ACK_VAL    0x0                          /*!< I2C ack value */
+#define NACK_VAL   0x1                          /*!< I2C nack value */
+
+// Control bytes (page 20)
+#define COMMAND_MODE 0x00
+#define SINGLE_COMMAND_MODE 0x80
+#define DATA_MODE 0x40
+
+// Fundamental Command (page 28)
+#define DISPLAY_LINE_START 0x40
+#define CONTRAST_CONTROL 0x81
+#define DISABLE_ENTIRE_DISPLAY 0xA4
+#define DISPLAY_ON_REG02 0xA5
+#define NORMAL_DISPLAY 0xA6
+#define DISPLAY_INVERSE  0xA7
+#define DISPLAY_RESET 0xAE
+#define DISPLAY_ON 0xAF
+
+// Hardware Config (page 31)
+#define DISPLAY_START_LINE 0x40
+#define SEGMENT_REMAP 0xA0
+#define MULTIPLEX_RATIO 0xA8
+#define COM_OUTPUT_SCAN_DIR 0xC0
+#define DISPLAY_OFFSET 0xD3
+#define COM_PINS_HARDWARE_CONFIG 0xDA
+
+// Timing & Driving Scheme (page 32)
+#define DISPLAY_CLK_RATIO 0xD5
+#define PRE_CHARGE_PER 0xD9
+#define VCOMH_DESELECT_LEVEL 0xDB
+#define NOOPERATION 0xE3
+
+// Charge Pump (page 60)
+#define CHARGE_PUMP_SET 0x8D
+
+
+#endif

+ 1 - 1
main/uart.c

@@ -33,7 +33,7 @@ void initUart() {
     };
     ESP_ERROR_CHECK(uart_param_config(UART_NUMBER, &uart_config));
 
-    ESP_ERROR_CHECK(uart_set_pin(UART_NUMBER, 17, 16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
+    ESP_ERROR_CHECK(uart_set_pin(UART_NUMBER, UART_TX_PIN, UART_RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
 
     const int uart_buffer_size = (1024 * 2);
     QueueHandle_t uart_queue;