I am running the following script on an M5Stack Fire with a Servo stack module and an Ultrasonic module connected to the portB (pin 36 as input and 26 as output):
#include <M5Stack.h>
#include <Adafruit_NeoPixel.h>
#include <Arduino.h>
#define M5STACK_FIRE_NEO_NUM_LEDS 10
#define M5STACK_FIRE_NEO_DATA_PIN 15
#define Echo_EingangsPin 36 // Echo Eingangs-Pin
#define Trigger_AusgangsPin 26 // Trigger Ausgangs-Pin
// Variables for Ultrasonic
int maximumRange = 300;
int minimumRange = 2;
long Abstand;
long Dauer;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(M5STACK_FIRE_NEO_NUM_LEDS, M5STACK_FIRE_NEO_DATA_PIN, NEO_GRB + NEO_KHZ800);
int angle = 90;
#define SERVO_ADDR 0x53
void setup() {
Serial.begin (115200);
pixels.begin();
setLEDout();
M5.begin();
M5.Power.begin();
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Ready!");
//M5.Lcd.drawJpgFile(SD, "/bird.jpg", 120, 80);
delay(2000); // To be able to connect Serial monitor after reset or power up and before first printout;
pinMode(Trigger_AusgangsPin, OUTPUT);
pinMode(Echo_EingangsPin, INPUT);
}
int8_t getBatteryLevel() {
Wire.beginTransmission(0x75);
Wire.write(0x78);
M5.Lcd.print("Batt Level = ");
if (Wire.endTransmission(false) == 0 && Wire.requestFrom(0x75, 1)) {
switch (Wire.read() & 0xF0) {
case 0xE0: M5.Lcd.println("25%");
case 0xC0: M5.Lcd.println("50%");
case 0x80: M5.Lcd.println("75%");
case 0x00: M5.Lcd.println("100%");
// default: Serial.print("0%");
}
}
}
// addr 0x11 mean control the number 1 servo by angle
void Servo_write_angle(uint8_t number, uint8_t angle) {
Wire.beginTransmission(SERVO_ADDR);
Wire.write(0x10 | number);
Wire.write(angle);
Wire.endTransmission();
}
void setLEDout() {
for (int iLED = 0; iLED < 10; iLED++) {
Serial.print(iLED);
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(iLED, pixels.Color(0, 0, 0)); // NO colour.
delay(100);
pixels.show(); // This sends the updated pixel color to the hardware.
}
delay(100);
M5.Lcd.fillScreen(BLACK);
}
void setLEDred() {
for (int iLED = 0; iLED < 10; iLED++) {
Serial.print(iLED);
pixels.setPixelColor(iLED, pixels.Color(10, 0, 0)); // RED colour.
delay(100);//Needed to stop leds random colors
pixels.show(); // This sends the updated pixel color to the hardware.
}
}
void setLEDgreen() {
for (int iLED = 0; iLED < 10; iLED++) {
Serial.print(iLED);
pixels.setPixelColor(iLED, pixels.Color(0, 10, 0)); // Green colour.
delay(100);
pixels.show(); // This sends the updated pixel color to the hardware.
}
}
void setLEDblue() {
for (int iLED = 0; iLED < 10; iLED++) {
Serial.print(iLED);
pixels.setPixelColor(iLED, pixels.Color(0, 0, 10)); // Blue colour.
delay(100);
pixels.show(); // This sends the updated pixel color to the hardware.
}
}
void setLEDyellow() {
for (int iLED = 0; iLED < 10; iLED++) {
Serial.print(iLED);
pixels.setPixelColor(iLED, pixels.Color(20, 20, 0)); // Yellow colour.
delay(100);
pixels.show(); // This sends the updated pixel color to the hardware.
}
}
void Forward() {
M5.Lcd.clear(BLACK);
angle = angle + 5;
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Anticlockwise");
M5.Lcd.print("Speed = ");
M5.Lcd.println(angle);
Servo_write_angle(0, 107);
Servo_write_angle(1, 75);
}
void Reverse() {
M5.Lcd.clear(BLACK);
angle = angle + 5;
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Anticlockwise");
M5.Lcd.print("Speed = ");
M5.Lcd.println(angle);
Servo_write_angle(0, 75);
Servo_write_angle(1, 105);
}
void Stop() {
M5.Lcd.clear(BLACK);
M5.Lcd.setCursor(0, 0);
M5.Lcd.print("Stop");
angle = 90;
Servo_write_angle(0, angle);
Servo_write_angle(1, angle);
}
void Right() {
M5.Lcd.clear(BLACK);
angle = angle + 5;
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Anticlockwise");
M5.Lcd.print("Speed = ");
M5.Lcd.println(angle);
Servo_write_angle(0, 105);
Servo_write_angle(1, 90);
}
void Left() {
M5.Lcd.clear(BLACK);
angle = angle + 5;
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Anticlockwise");
M5.Lcd.print("Speed = ");
M5.Lcd.println(angle);
Servo_write_angle(0, 90);
Servo_write_angle(1, 75);
}
void loop() {
M5.update();
if (M5.BtnA.wasPressed()) {
Forward();
}
if (M5.BtnB.wasPressed()) {
Stop();
}
M5.Lcd.setTextColor(RED);
M5.Lcd.setTextSize(6);
//M5.Lcd.println("Hello");
// Abstandsmessung wird mittels des 10us langen Triggersignals gestartet
digitalWrite(Trigger_AusgangsPin, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger_AusgangsPin, LOW);
// Nun wird am Echo-Eingang gewartet, bis das Signal aktiviert wurde
// und danach die Zeit gemessen, wie lang es aktiviert bleibt
Dauer = pulseIn(Echo_EingangsPin, HIGH);
// Nun wird der Abstand mittels der aufgenommenen Zeit berechnet
Abstand = Dauer / 58.2;
// Überprüfung ob gemessener Wert innerhalb der zulässingen Entfernung liegt
if (Abstand >= maximumRange || Abstand <= minimumRange)
{
// Falls nicht wird eine Fehlermeldung ausgegeben.
M5.Lcd.println("Clear");
}
else
{
// Der berechnete Abstand wird in der seriellen Ausgabe ausgegeben
M5.Lcd.clear(BLACK);
M5.Lcd.setCursor(90, 90);
M5.Lcd.print(Abstand);
M5.Lcd.println("cm");
if(Abstand <= 7) {
setLEDred();
Reverse();
delay(1000);
Left();
delay(1000);
Forward();
}
}
// Pause zwischen den einzelnen Messungen
delay(100);
}
This works fine with the Abstand variable below 8 but if the Abstand variable is set to 8 or above the sketch doesn't load and I get the error:
E (1881) spiram: SPI SRAM memory test fail. 391/131072 writes failed, first @ 3F800000
I would be grateful for any help in solving this. Please be aware the sketch is a work in progress and is by no means finished.