ESP-Miner/main/system.c

104 lines
2.4 KiB
C

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "driver/i2c.h"
#include "driver/gpio.h"
#include "led_controller.h"
#include "DS4432U.h"
#include "EMC2101.h"
#include "INA260.h"
#include "adc.h"
#include "oled.h"
#define USE_OLED 1 //Set to 1 to use OLED, 0 to not use it
static const char *TAG = "system";
void init_system(void) {
//test the LEDs
// ESP_LOGI(TAG, "Init LEDs!");
// ledc_init();
// led_set();
//Playing with BI level
gpio_set_direction(GPIO_NUM_10, GPIO_MODE_OUTPUT);
gpio_set_level(GPIO_NUM_10, 0);
//Init I2C
ESP_ERROR_CHECK(i2c_master_init());
ESP_LOGI(TAG, "I2C initialized successfully");
ADC_init();
//DS4432U tests
DS4432U_set_vcore(1.2);
//Fan Tests
EMC2101_init();
EMC2101_set_fan_speed(0);
vTaskDelay(500 / portTICK_PERIOD_MS);
//oled
#ifdef USE_OLED
if (!OLED_init()) {
ESP_LOGI(TAG, "OLED init failed!");
} else {
ESP_LOGI(TAG, "OLED init success!");
OLED_clear();
OLED_writeString(0, 0, "The bitaxe!");
}
#endif
}
void get_stats(void) {
char oled_buf[20];
uint16_t fan_speed = EMC2101_get_fan_speed();
float chip_temp = EMC2101_get_chip_temp();
float current = INA260_read_current();
float voltage = INA260_read_voltage();
float power = INA260_read_power();
uint16_t vcore = ADC_get_vcore();
ESP_LOGI(TAG, "Fan Speed: %d RPM", fan_speed);
ESP_LOGI(TAG, "Chip Temp: %.2f C", chip_temp);
//Current Sensor tests
ESP_LOGI(TAG, "Current: %.2f mA", current);
ESP_LOGI(TAG, "Voltage: %.2f mV", voltage);
ESP_LOGI(TAG, "Power: %.2f mW", power);
//ESP32 ADC tests
ESP_LOGI(TAG, "Vcore: %d mV\n", vcore);
if (OLED_status()) {
memset(oled_buf, 0, 20);
snprintf(oled_buf, 20, "Fan: %d RPM", fan_speed);
OLED_clearLine(1);
OLED_writeString(0, 1, oled_buf);
memset(oled_buf, 0, 20);
snprintf(oled_buf, 20, "Temp: %.2f C", chip_temp);
OLED_clearLine(2);
OLED_writeString(0, 2, oled_buf);
memset(oled_buf, 0, 20);
snprintf(oled_buf, 20, "Pwr: %.2f mW", power);
OLED_clearLine(3);
OLED_writeString(0, 3, oled_buf);
}
}
void SysTask(void *arg) {
init_system();
while(1){
get_stats();
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
}