Program Resource

Resource libraries for programmers and developers

Simple sketch using M5 StickC for counting stepper motor RPM.

Sensor using laser and laser detector. Connect laser detector signal to pin 33.

Modified from other sketch, there are some unused display related codes.

#include <M5StickC.h>
#include <Wire.h>

#define PIN_SENSOR	33
int lastdata[2];
char chbuff[32], chbuff_num[32];
unsigned long current_millis;
unsigned long last_data_update = 0;

void drawflame() {
	//resolution 160x80
	M5.Lcd.fillScreen(BLACK);
	M5.Lcd.drawRoundRect(5, 5, 75, 35, 3, DARKCYAN);
	M5.Lcd.drawRoundRect(5, 5 + 40, 75, 35, 3, DARKCYAN);
	M5.Lcd.drawRoundRect(5 + 80, 5 + 40, 75, 35, 3, DARKCYAN);
	M5.Lcd.setTextColor(WHITE, BLACK);
	M5.Lcd.setTextSize(1);
	M5.Lcd.setCursor(10, 2);
	M5.Lcd.print("rpm");
	M5.Lcd.setCursor(10, 42);
	M5.Lcd.print("---");
	M5.Lcd.setCursor(90, 42);
	M5.Lcd.print("---");
}

void showtext(char *msg) {
	M5.Lcd.fillScreen(BLACK);
	M5.Lcd.setTextColor(WHITE);
	M5.Lcd.setCursor(10, 30);
	M5.Lcd.setTextSize(1);
	M5.Lcd.print(msg);
}

void showtext_relay(char *val) {
	int xshift = 80, yshift = 40;
	M5.Lcd.fillRect(10 + xshift, 10 + yshift, 65, 25, BLACK);
	M5.Lcd.setTextSize(2);
	M5.Lcd.setTextDatum(MC_DATUM);
	M5.Lcd.drawString(val, 40 + xshift, 24 + yshift);
}

void showtext_data(int pos, int val, char *unit) {
	int xshift = 0, yshift = 0;
	if (lastdata[pos] == val)
		return;
	lastdata[pos] = val;

	if (pos == 1)
		yshift = 40;
	M5.Lcd.fillRect(10 + xshift, 10 + yshift, 65, 25, BLACK);
	M5.Lcd.setTextSize(1);
	M5.Lcd.setTextDatum(BR_DATUM);
	M5.Lcd.drawString(unit, 78 + xshift, 34 + yshift);
	M5.Lcd.setTextSize(2);
	M5.Lcd.setTextDatum(MC_DATUM);
	sprintf(chbuff, "%d", val);
	M5.Lcd.drawString(chbuff, 40 + xshift, 24 + yshift);
}

int last_sensor = LOW;
int new_sensor;
unsigned long last_sensor_time;
unsigned long rot_diff;

void setup() {
	M5.begin();
	delay(10);

	Serial.println("boot");

	M5.Lcd.setRotation(1);
	M5.Axp.ScreenBreath(10);

	pinMode(PIN_SENSOR,INPUT);
	last_sensor = digitalRead(PIN_SENSOR);
	
	drawflame();
	//showtext_relay("Off");
	Serial.println("ready");
}

void loop() {
	M5.update();

	new_sensor = digitalRead(PIN_SENSOR);
	if (new_sensor != last_sensor){
		last_sensor = new_sensor;
		if (new_sensor == HIGH){
			//Serial.println("detect");
			if (millis() - last_sensor_time > 22){
				rot_diff = millis() - last_sensor_time;
				Serial.println(rot_diff);
				last_sensor_time = millis();
			}
		}
	}

	current_millis = millis();
	if ((unsigned long)(current_millis - last_data_update) >= 300) {
		last_data_update = current_millis;
		if (rot_diff > 0)
			showtext_data(0, (int)(60000/rot_diff), "rpm");
	}
}

Print Friendly, PDF & Email

This post is also available in: Japanese