Programming #
The NORVI EC-M11-BC-C4-S has a mini USB port for serial connection with the SoC for programming. Any ESP32-supported programming IDE can be used to program the controller. Follow this guide to programming NORVI ESP32-based controllers with the Arduino IDE.
SoC: ESP32-WROOM32
Programming Port: USB UART
Wiring, thermocouple input, and solar #
8-pin and 3-pin connectors and wire harness #

Pin Description #
| 8P Male | Wire color | I/O Configuration | 
| 1 | White | Thermocouple + | 
| 2 | Brown | Thermocouple – | 
| 3 | Green | – | 
| 4 | Yellow | – | 
| 5 | Gray | – | 
| 6 | Pink | – | 
| 7 | Blue | – | 
| 8 | Red | – | 
| 3P Male | Wire color | I/O Configuration | 
| 1 | Blue | Solar Panel + | 
| 2 | Black | Not in Use | 
| 3 | Brown | Solar Panel – | 
Thermocouple Input #
| SPI MISO | GPIO19 | 
| SPI SCK | GPIO18 | 
| CS | GPIO5 | 
Programming Thermocouple Inputs #
#include <SPI.h>
#include "Adafruit_MAX31855.h"
#define MAXDO  19
#define MAXCS   5
#define MAXCLK 18                // Initialize the Thermocouple
Adafruit_MAX31855 thermocouple(MAXCLK, MAXCS, MAXDO);
void setup() {
  Serial.begin(115200);
  Serial.println("MAX31855 test");         // Wait for MAX chip to stabilize
  delay(500);
  Serial.print("Initializing sensor...");
  if (!thermocouple.begin()) {
    Serial.println("ERROR.");
    while (1) delay(10);
  }
  Serial.println("DONE.");
}
void loop() {
  Serial.print("Internal Temp = ");
  Serial.println(thermocouple.readInternal());
  double c = thermocouple.readCelsius();
  if (isnan(c)) {
    Serial.println("Thermocouple fault(s) detected!");
    uint8_t e = thermocouple.readError();
    if (e & MAX31855_FAULT_OPEN) Serial.println("FAULT: Thermocouple is open - no connections.");
    if (e & MAX31855_FAULT_SHORT_GND) Serial.println("FAULT: Thermocouple is short-circuited to GND.");
    if (e & MAX31855_FAULT_SHORT_VCC) Serial.println("FAULT: Thermocouple is short-circuited to VCC.");
  } 
  else {
    Serial.print("C = ");
    Serial.println(c);
  }          
  //Serial.print("F = ");
  //Serial.println(thermocouple.readFahrenheit());
  Serial.println("");
  Serial.print("Analog Read : ");
  Serial.print(analogRead(36));
  Serial.println("");
  delay(1000);
}
LoRa Transceiver Module #
| Specification | Long Range(LoRa) | 
| RF Transceiver | RFM95W-915S2 | 
| SPI MISO | GPIO19 | 
| SPI MOSI | GPIO23 | 
| SPI SCK | GPIO18 | 
| NSS | GPIO26 | 
| DIO0 | GPIO25 | 
| DIO1 | GPIO27 | 
| DIO2 | NOT CONNECTED | 
| RESET | GPIO15 | 
Programming LoRa Modules #
#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>
#define CONFIRMED_MSG_RETRY_COUNT 3
static const u1_t PROGMEM APPEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void os_getArtEui (u1_t* buf) {
  memcpy_P(buf, APPEUI, 8);
}
static const u1_t PROGMEM DEVEUI[8] = {0x4B, 0x11, 0x3F, 0xB1, 0x3C, 0xBE, 0xD6, 0x56};
void os_getDevEui (u1_t* buf) {
  memcpy_P(buf, DEVEUI, 8);
}
static const u1_t PROGMEM APPKEY[16] = {0xF9, 0x65, 0xE4, 0xED, 0xFF, 0x8A, 0x89, 0x27, 0x23, 0xA6, 0xB7, 0x42, 0x2F, 0x05, 0x8E, 0x9F};
void os_getDevKey (u1_t* buf) {
  memcpy_P(buf, APPKEY, 16);
}
static uint8_t mydata[] = "Hello, world!";
static osjob_t sendjob;
const unsigned TX_INTERVAL = 60;
const lmic_pinmap lmic_pins = {
  .nss = 26,
  .rxtx = LMIC_UNUSED_PIN,
  .rst = 15,
  .dio = {25, 27, -1},
};
void printHex2(unsigned v) {
  v &= 0xff;
  if (v < 16)
    Serial.print('0');
  Serial.print(v, HEX);
}
Solar Input #
| Solar Powered Model | CN3083 | 
| Maximum Charge Current | 600mA | 
| Maximum Voltage | 6V | 
| Input Voltage monitor | ADS1115 – 0x49 – AIN2 | 
Battery Input #
| Battery Type | 103040 Lithium polymer battery | 
| Nominal Capacity | 1200mAh | 
| Nominal Voltage | 3.75V | 
| Overcharge | 4.2V | 
| Over-discharge Cutoff Voltage | 3V | 
Programming Solar and Battery #
#include <Adafruit_SSD1306.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ads1;
int analog_value = 0;
void setup() {
  Serial.begin(115200);// put your setup code here, to run once:
  Wire.begin(16,17);
  if (!ads1.begin(0x49)) {
    Serial.println("Failed to initialize ADS 1 .");
    while (1);
  }
}
void loop() {
  int16_t adc0, adc1, adc2, adc3;
  adc0 = ads1.readADC_SingleEnded(0);
  adc1 = ads1.readADC_SingleEnded(1);
  adc2 = ads1.readADC_SingleEnded(2);
  adc3 = ads1.readADC_SingleEnded(3);
  Serial.println("-----------------------------------------------------------");
  Serial.print("AIN1: "); 
  Serial.print(adc0); 
  Serial.println("  ");
  Serial.print("AIN2: "); 
  Serial.print(adc1); 
  Serial.println("  ");
  Serial.print("SOLAR: "); 
  Serial.print(adc2); 
  Serial.println("  ");
  Serial.print("AIN4: "); 
  Serial.print(adc3); 
  Serial.println("  ");   
}