Porting Atmega328 code to esp32
- 
					
					
					
					
 I have code I am writing for the Atmega 328p using the Arduino environment. 
 What do I need to know to port the code to the ESP32 used in the M5?This is my code: /******************************************************************* 
 This is a direct hack of adafruits ssd1306*64 i2c file
 Todo
 Add PAS (Pedal Assist Sensor) control code
 Actual Motor output to Motpin
 *********************************************************************/#include <SPI.h> 
 #include <Wire.h>
 #include <Adafruit_GFX.h>
 #include <Adafruit_SSD1306.h>/* HAll503 Config / 
 int ThrotPin = 3; // Throttle Hall Sensor
 int Th = '0'; // Variable th stores reading from HALL503
 / End of HAll503 Config /
 int Motpin = 9; // PWM output pin for brused motor control.
 / Motor Control /
 int PasPin = 2; // PAS Pin
 int Pas = '0';
 / PAS Sensor */#define OLED_RESET 4 
 Adafruit_SSD1306 display(OLED_RESET);#define NUMFLAKES 10 
 #define XPOS 0
 #define YPOS 1
 #define DELTAY 2#define LOGO16_GLCD_HEIGHT 16 
 #define LOGO16_GLCD_WIDTH 16
 static const unsigned char PROGMEM logo16_glcd_bmp[] =
 { B00000011, B11000000,
 B00001100, B00110000,
 B00010000, B00001000,
 B00100000, B00000100,
 B01000100, B00000010,
 B01000100, B00000010,
 B10000100, B00000001,
 B10000010, B00000001,
 B10000010, B00000001,
 B10000010, B00000001,
 B01000000, B00000010,
 B01000001, B10000010,
 B00100011, B11000100,
 B00010000, B00001000,
 B00001100, B00110000,
 B00000011, B11000000, };#if (SSD1306_LCDHEIGHT != 64) 
 #error("Height incorrect, please fix Adafruit_SSD1306.h!");
 #endifvoid setup() { 
 Serial.begin(9600); // Only for debugging.// by default, we'll generate the high voltage from the 3.3v line internally! (neat!) 
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
 // init done
 }void loop() 
 {
 display.clearDisplay();
 display.drawBitmap(1, 1, logo16_glcd_bmp, 16, 16, 1);
 // text display tests
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.setCursor(20,0);
 Th = analogRead(ThrotPin); // read the input pin
 Serial.println(Th); //Prints to Serial terminal
 display.println(Th); //Prints to display
 display.setCursor(0,20);
 Pas = analogRead(PasPin);
 display.println(Pas);
 display.display();
 delay(10);
 // analogWrite(Motpin, Th / 4); // Analogue read is 0-1024, Analogue write is 0-256
 }void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { 
 uint8_t icons[NUMFLAKES][3];
 }void testdrawchar(void) { 
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0,0);for (uint8_t i=0; i < 168; i++) { 
 if (i == '\n') continue;
 display.write(i);
 if ((i > 0) && (i % 21 == 0))
 display.println();
 }
 display.display();
 }**
- 
					
					
					
					
 If you want to use the oled display, the code should work as it is. 
 If you want to use the M5Stack LCD, you need to know some basic C/C++ (Arduino) programming to port the code.
 First of all, you must switch from Adafruit_SSD1306 and Adafruit_GFX libraries to M5Stack library.I can port this code for you to M5Stack but i think you should learn some arduino programming so you can write better code than this one... 
- 
					
					
					
					
 @calin 在 Porting Atmega328 code to esp32 ä¸è¯´ï¼š If you want to use the oled display, the code should work as it is. 
 If you want to use the M5Stack LCD, you need to know some basic C/C++ (Arduino) programming to port the code.
 First of all, you must switch from Adafruit_SSD1306 and Adafruit_GFX libraries to M5Stack library.Is that where I replace the calls with the M5.Lcd. versions printed in the instruction leaflet? 
 And serial.begin needs to be replaced with M5.Serial0/2.begin(9600) ?I can port this code for you to M5Stack but i think you should learn some arduino programming so you can write better code than this one... Please don't. As you can see, I need to learn how to do this myself. 
 Is this any better? (well for the Arduino?)**#include <SPI.h> 
 #include <Wire.h>
 #include <Adafruit_GFX.h>
 #include <Adafruit_SSD1306.h>// Pin defines. 
 // int clkPin = A5;
 // int sclPin = A4;
 int throtPin = A3;
 int pasPin = A2;
 int spdPin = A1;
 int motPin = 9;
 // End of Pin defines.
 // Variable Defines.
 int th = '0';
 int pas = '0';
 int spd = '0';
 int mot = '0';
 //End of Variable defines.#define OLED_RESET 4 
 Adafruit_SSD1306 display(OLED_RESET);void setup() 
 // put your setup code here, to run once:
 {
 pinMode(throtPin, INPUT);
 pinMode(pasPin, INPUT);
 pinMode(spdPin, INPUT);
 pinMode(motPin, OUTPUT);
 Serial.begin(9600); // Only for debugging.
 // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
 // init done.
 }void loop() { 
 // put your main code here, to run repeatedly:th = analogRead(throtPin); 
 pas = analogRead(pasPin);
 spd = analogRead(spdPin);
 display.clearDisplay();
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.setCursor(20,0);
 display.println(th);
 display.setCursor(0,20);
 display.println(pas);
 display.display();
 Serial.println(th); //Prints to Serial terminal
 Serial.println(pas); //Prints to Serial terminal
 Serial.println(spd); //Prints to Serial terminal**A couple of questions? - How fast can the serial communicate on the M5?
- Will the arduinos serial terminal show the outputs?
- Where do I find the M5's register commands?
- In the leaflet that came with the M5 it shows 2 ADC but the site shows more.
 Which is correct?
 
- 
					
					
					
					
 @ajb2k3 Forget about that leaflet. 
 Check the code from M5Stack library and the examples for M5Stack.
 You can learn way more from that code.- 
The serial baudrate is 115200 by default. 
- 
Yes. The Arduino terminal will show the output. 
- 
Forget about the M5 register commands. This is NOT an ancient 8bit controller like the arduino AVR. 
 Comparing the ATmega328p from Arduino Uno with ESP32 from M5Stack is like comparing a hammer with an fighter jet...
 Is a real hassle to deal with ESP32 registers and better just don't...
 Stick with the gpio access functions.
- 
On M5Stack any pin (except the reset pin) can be used as ADC pin 
 
- 
- 
					
					
					
					
 Sweet, thanks for taking the time to answer my questions. 
