Arduino Uno с датчиком, модулем Bluetooth и tft lcd
В приведенном ниже коде я использую дисплей tftlcd с диагональю 2,4 дюйма, на котором я хочу показать часы в качестве домашней страницы, когда пользователь нажимает на экран tftlcd, появляется экран, который может показать пользователю три параметра, которые касаются датчиков, которые хочет пользователь. использовать. В этом коде три датчика: пульсоксиметр, глюкометр, шагомер. После выбора какой-либо опции (датчика) данные датчика появятся на экране. У меня есть код для всей этой процедуры, который приведен ниже:
//подключаем все библиотеки
#include <Wire.h>
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h>
#include <SPFD5408_TouchScreen.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
//Кнопки выхода
bool backsensed = false;
bool resetsensed = false;
// Включаем библиотеку Max30102
MAX30105 particleSensor;
// Определяем контакты ЖК-дисплея
#define YP A1 // должен быть аналоговым выводом, используйте "An" обозначение!
#define XM A2 // должен быть аналоговым выводом, используйте "An" обозначение!
#define YM 7 // может быть цифровым выводом
#define XP 6 // может быть цифровым выводом
//шагомер
const int xpin = A3;
const int ypin = A4;
const int zpin = A5;
byte p[8] = {0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F
};
float threshold = 100;
float xval[100] = {0};
float yval[100] = {0};
float zval[100] = {0};
float xavg, yavg, zavg;
int steps, flag = 0;
// пульсокси
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
uint16_t irBuffer[100]; //данные инфракрасного светодиодного датчика
uint16_t redBuffer[100]; //данные датчика красного светодиода
#else
uint32_t irBuffer[100]; //данные инфракрасного светодиодного датчика
uint32_t redBuffer[100]; //данные датчика красного светодиода
#endif
int32_t bufferLength; //длина данных
int32_t spo2; //значение SPO2
int8_t validSPO2; //индикатор, показывающий, верен ли расчет SPO2
int32_t heartRate; //значение сердечного ритма
int8_t validHeartRate; //индикатор, показывающий, верен ли расчет сердечного ритма
byte pulseLED = 11; // Должен быть на выводе PWM
byte readLED = 13; //Мигает при каждом чтении данных
// Значения калибровки ЖК-дисплея
#define TS_MINX 100
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
// Для большей точности давления нам нужно знать сопротивление между X+ и X- Используйте любой мультиметр, чтобы считать его
// Для того, который мы используем, это 300 Ом на пластине X
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
int BLUE = tft.color565(50, 50, 255);
#define TFT_BLACK 0x0000
#define TFT_DARKBLUE 0x0010
#define VIOLET 0x8888
#define TFT_RED 0xF800
#define TFT_GREEN 0x07E0
#define TFT_CYAN 0x07FF
#define TFT_MAGENTA 0xF81F
#define TFT_YELLOW 0xFFE0
#define TFT_WHITE 0xFFFF
#define TFT_GREY 0x5AEB
#define TFT_BLUE 0x001F
#define GOLD 0xFEA0
#define BROWN 0xA145
#define SILVER 0xC618
#define LIME 0x07E0
#define BLUE 0x001F
//кнопочный экран
int currentpcolour;
int currentpage;
bool running;
//Минимальное и максимальное давление для ощущения прикосновения
#define MINPRESSURE 10
#define MAXPRESSURE 1000
//Часы
float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0;
float sdeg = 0, mdeg = 0, hdeg = 0;
uint16_t osx = 120, osy = 120, omx = 120, omy = 120, ohx = 120, ohy = 120;
int16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0, x00 = 0, yy00 = 0;
uint32_t targetTime = 0;
uint16_t xpos;
uint8_t conv2d(const char* p) {
uint8_t v = 0;
if ('0' <= *p && *p <= '9')
v = *p - '0';
return 10 * v + *++p - '0';
}
uint8_t hh = conv2d(__TIME__), mm = conv2d(__TIME__ + 3), ss = conv2d(__TIME__ + 6);
boolean initial = 1;
char d;
//для кнопок
void drawHome()
{
tft.fillScreen(TFT_BLACK);
tft.drawRoundRect(0, 0, 319, 240, 8, TFT_YELLOW); //Граница страницы
tft.fillRoundRect(60, 180, 200, 40, 8, TFT_DARKBLUE);
tft.drawRoundRect(60, 180, 200, 40, 8, TFT_YELLOW); // ПЕДО
tft.fillRoundRect(60, 130, 200, 40, 8, TFT_DARKBLUE); //глу
tft.drawRoundRect(60, 130, 200, 40, 8, TFT_YELLOW);
tft.fillRoundRect(60, 80, 200, 40, 8, TFT_DARKBLUE);
tft.drawRoundRect(60, 80, 200, 40, 8, TFT_YELLOW); //Пульс окси и частота сердечных сокращений
tft.setCursor(25, 20);
tft.setTextSize(3);
tft.setTextColor(TFT_WHITE);
tft.print("Welcome Here..");
tft.setCursor(25, 50);
tft.setTextSize(2);
tft.setTextColor(TFT_YELLOW);
tft.print("Choose Your Sensor");
tft.setTextColor(TFT_WHITE);
tft.setCursor(110, 195);
tft.print("Pedometer");
tft.setCursor(80, 145);
tft.print("Glucose Sensor");
tft.setCursor(80, 95);
tft.print("Pulse Oximeter");
// delay(500);
}
void setup()
{
tft.reset();
tft.begin(0x9341);
tft.setRotation(1);
currentpage = 0; //страница часов
tft.setTextColor(TFT_WHITE);// цвет текста
tft.fillScreen(TFT_BLACK);// цвет фона
xpos = tft.width() / 2;
tft.drawCircle(xpos, 120, 125, TFT_YELLOW);
tft.fillCircle(xpos, 120, 118, TFT_BLUE);
tft.fillCircle(xpos, 120, 110, TFT_BLACK);
for (int a=95; a<104; a++){
tft.drawCircle(xpos, 120, a, TFT_WHITE);}
for (int i = 0; i < 360; i += 30) {
sx = cos((i - 90) * 0.0174532925);
sy = sin((i - 90) * 0.0174532925);
x0 = sx * 114 + xpos;
yy0 = sy * 114 + 120;
x1 = sx * 100 + xpos;
yy1 = sy * 100 + 120;
tft.drawLine(x0, yy0, x1, yy1, TFT_YELLOW);
}
for (int i = 0; i < 360; i += 6) {
sx = cos((i - 90) * 0.0174532925);
sy = sin((i - 90) * 0.0174532925);
x0 = sx * 102 + xpos;
yy0 = sy * 102 + 120;
x00 = sx * 92 + xpos;
yy00 = sy * 92 + 120;
// Рисуем минутные маркеры
tft.drawPixel(x0, yy0, TFT_GREEN);
tft.drawLine(x0, yy0, x00, yy00, TFT_BLACK);
tft.drawLine(x0+1, yy0+1, x00+1, yy00+1, TFT_BLACK);
// Рисуем точки основного квадранта
if (i == 0 || i == 180) tft.fillCircle(x0, yy0, 2, TFT_WHITE);
if (i == 90 || i == 270) tft.fillCircle(x0, yy0, 2, TFT_WHITE);
}
tft.fillCircle(xpos, 121, 3, TFT_WHITE);
targetTime = millis() + 1000;
//событие касания
tft.setCursor (80, 250);
tft.setTextSize (1);
tft.setTextColor(TFT_BLACK);
tft.println("Touch to proceed");
waitOneTouch(); // Ожидание касания
drawHome(); // экран кнопок
}
void loop(){
if (currentpage == 0){
if (targetTime < millis()) { // код часов
targetTime = millis() + 1000;
ss++;
if (ss == 60) {
ss = 0;
mm++;
if (mm > 59) {
mm = 0;
hh++;
if (hh > 23) {
hh = 0;
}
}
}
sdeg = ss * 6; // 0-59 -> 0-354
mdeg = mm * 6 + sdeg * 0.01666667; // 0-59 -> 0-360 - включает секунды, но эти приращения не используются
hdeg = hh * 30 + mdeg * 0.0833333; // 0-11 -> 0-360 - включает минуты и секунды, но эти приращения не используются
hx = cos((hdeg - 90) * 0.0174532925);
hy = sin((hdeg - 90) * 0.0174532925);
mx = cos((mdeg - 90) * 0.0174532925);
my = sin((mdeg - 90) * 0.0174532925);
sx = cos((sdeg - 90) * 0.0174532925);
sy = sin((sdeg - 90) * 0.0174532925);
if (ss == 0 || initial) {
initial = 0;
// Стирать позиции часовой и минутной стрелок каждую минуту
tft.drawLine(ohx, ohy, xpos, 121, TFT_BLACK);
ohx = hx * 62 + xpos + 1;
ohy = hy * 62 + 121;
tft.drawLine(omx, omy, xpos, 121, TFT_BLACK);
omx = mx * 84 + xpos;
omy = my * 84 + 121;
}
// Перерисовываем новые положения стрелок, часовая и минутная стрелки здесь не стерты, чтобы избежать мерцания
tft.drawLine(osx, osy, xpos, 121, TFT_BLACK);
osx = sx * 90 + xpos + 1;
osy = sy * 90 + 121;
tft.drawLine(osx, osy, xpos, 121, TFT_RED);
tft.drawLine(ohx, ohy, xpos, 121, TFT_CYAN);
tft.drawLine(omx, omy, xpos, 121, TFT_WHITE);
tft.drawLine(osx, osy, xpos, 121, TFT_RED);
tft.fillCircle(xpos, 121, 3, TFT_RED);
tft.setCursor(xpos-30, 50);
tft.setTextSize(2);
tft.print("Glucoxy");
// Рисуем МИНИ-циферблат "SECOND"
tft.drawCircle(xpos, 155, 20, TFT_YELLOW);
tft.drawCircle(xpos, 155, 18, TFT_BLUE);
tft.drawCircle(xpos, 155, 17, TFT_CYAN);
tft.drawCircle(xpos, 155, 16, TFT_CYAN);
tft.fillRect(xpos-10, 149,22,15,TFT_BLACK); //стереть
if(ss<10){tft.setCursor(xpos-10, 149); tft.setTextSize(2);
tft.print('0'); tft.setCursor(xpos+2, 149);}
else{
tft.setCursor(xpos-10, 149);}
tft.setTextSize(2);
tft.print(ss);
// Рисуем МИНИ-циферблат "Минуты"
tft.drawCircle(xpos+35, 117, 20, TFT_YELLOW);
tft.drawCircle(xpos+35, 117, 18, TFT_BLUE);
tft.drawCircle(xpos+35, 117, 17, TFT_CYAN);
tft.drawCircle(xpos+35, 117, 16, TFT_CYAN);
tft.fillRect(xpos+25, 111,22,15,TFT_BLACK); //стереть
if(mm<10){tft.setCursor(xpos+25, 111); tft.setTextSize(2);
tft.print('0'); tft.setCursor(xpos+37, 111);}
else{
tft.setCursor(xpos+25, 111);}
tft.println(mm);
// Рисуем МИНИ-циферблат "Час"
tft.drawCircle(xpos-35, 117, 20, TFT_YELLOW);
tft.drawCircle(xpos-35, 117, 18, TFT_BLUE);
tft.drawCircle(xpos-35, 117, 17, TFT_CYAN);
tft.drawCircle(xpos-35, 117, 16, TFT_CYAN);
tft.fillRect(xpos-45, 111,22,15,TFT_BLACK); //стереть
if(hh<10){tft.setCursor(xpos-45, 111); tft.setTextSize(2);
tft.print('0'); tft.setCursor(xpos-33, 111);}
else{
tft.setCursor(xpos-45, 111);}
tft.setTextSize(2);
tft.print(hh);
//tft.setCursor(xpos-65, 111);
//tft.println(':');
if (hh>=0 && hh<12) d='A'; else {d='P';}
tft.drawRoundRect(xpos-14,72,29,21,5,TFT_CYAN);
tft.fillRect(xpos-11, 75,23,15,TFT_BLACK); //стереть
tft.setCursor(xpos-11, 75);
tft.setTextSize(2);
tft.print(d);
tft.println('M');
}
}
// домашняя страница
if (currentpage == 1){
digitalWrite(13, HIGH);
TSPoint p = ts.getPoint(); // Чтение сенсорного экрана
digitalWrite(13, LOW);
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
{if (p.z > 10 && p.z < 1000)
{
if (p.x > 736 && p.x < 855 && p.y > 255 && p.y < 725 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{
Serial.println("Pedometer");
tft.fillRoundRect(60, 180, 200, 40, 8, TFT_WHITE);
delay(70);
tft.fillRoundRect(60, 180, 200, 40, 8, TFT_WHITE);
tft.drawRoundRect(60, 180, 200, 40, 8, TFT_YELLOW);
tft.setCursor(65, 195);
tft.println(" Pedometer");
delay(70);
currentpage = 2;
startPedo();
}
else if (p.x > 563 && p.x < 683 && p.y > 275 && p.y < 750)
{
Serial.println("Glucose Sensor");
tft.fillRoundRect(60, 130, 200, 40, 8, TFT_WHITE); //светодиод RGB
delay(70);
tft.fillRoundRect(60, 130, 200, 40, 8, TFT_WHITE); //светодиод RGB
tft.drawRoundRect(60, 130, 200, 40, 8, TFT_YELLOW); //светодиод RGB
tft.setCursor(105, 145);
tft.print("Glucose Sensor");
delay(70);
currentpage = 3;
startGlu();
}
if (p.x > 403 && p.x < 525 && p.y > 271 && p.y < 725)
{
Serial.println("Pulse Oximeter");
currentpage = 4;
tft.fillRoundRect(60, 80, 200, 40, 8, TFT_WHITE);
delay(70);
tft.fillRoundRect(60, 80, 200, 40, 8, TFT_WHITE);
tft.drawRoundRect(60, 80, 200, 40, 8, TFT_YELLOW);
tft.setCursor(80, 95);
tft.print("Pulse Oximeter");
delay(70);
// startPulse();
}
}
}
if (currentpage == 2) //педо
{
senseBack();
if (backsensed)
{
currentpage = 1;
drawHome();
}
sensereset();
calibrate();
}
if (currentpage == 3) // глюкоза
{
senseBack();
if (backsensed)
{
currentpage = 0;
drawHome();
}
sensereset();
}
if (currentpage == 4) //пульс окси
{
senseBack();
if (backsensed)
{
currentpage = 1;
drawHome();
}
sensereset();
pinMode(pulseLED, OUTPUT);
pinMode(readLED, OUTPUT);
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) // Использовать порт I2C по умолчанию, скорость 400 кГц // Инициализировать датчик
{
Serial.println(F("MAX30105 was not found. Please check wiring/power."));
while (1);
}
Serial.println(F("Attach sensor to finger with rubber band. Press any key to start conversion"));
while (Serial.available() == 0) ; //ждем, пока пользователь не нажмет клавишу
Serial.read();
byte ledBrightness = 60; //Опции: от 0=Выкл. до 255=50 мА
byte sampleAverage = 4; //Опции: 1, 2, 4, 8, 16, 32
byte ledMode = 2; //Опции: 1 = только красный, 2 = красный + ИК, 3 = красный + ИК + зеленый
byte sampleRate = 100; //Опции: 50, 100, 200, 400, 800, 1000, 1600, 3200
int pulseWidth = 411; //Опции: 69, 118, 215, 411
int adcRange = 4096; //Опции: 2048, 4096, 8192, 16384
particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Настройте датчик с этими настройками
startPulse();
}
}
}
// Ждем одно касание
TSPoint waitOneTouch() {
TSPoint p;
do {
p= ts.getPoint();
pinMode(XM, OUTPUT); // Контакты снова настраиваются для управления TFT
pinMode(YP, OUTPUT);
} while((p.z < MINPRESSURE )|| (p.z > MAXPRESSURE));
return p;
}
void sensereset()
{
digitalWrite(13, HIGH);
TSPoint p = ts.getPoint(); // Чтение сенсорного экрана
digitalWrite(13, LOW);
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.x < 199 && p.y < 293 && !running)
resetsensed = true;
else
resetsensed = false;
}
void startPedo() //---------------------------------функция шагомера----------------------- ---
{
int acc = 0;
float totvect[100] = {0};
float totave[100] = {0};
float xaccl[100] = {0};
float yaccl[100] = {0};
float zaccl[100] = {0};
for (int a = 0; a < 100; a++)
{
xaccl[a] = float(analogRead(xpin) - 345);
delay(1);
yaccl[a] = float(analogRead(ypin) - 346);
delay(1);
zaccl[a] = float(analogRead(zpin) - 416);
delay(1);
totvect[a] = sqrt(((xaccl[a] - xavg) * (xaccl[a] - xavg)) + ((yaccl[a] - yavg) * (yaccl[a] - yavg)) + ((zval[a] - zavg) * (zval[a] - zavg)));
totave[a] = (totvect[a] + totvect[a - 1]) / 2 ;
Serial.println("totave[a]");
Serial.println(totave[a]);
delay(100);
if (totave[a] > threshold && flag == 0)
{
steps = steps + 1;
flag = 1;
}
else if (totave[a] > threshold && flag == 1)
{
// Не считать
}
if (totave[a] < threshold && flag == 1)
{
flag = 0;
}
if (steps < 0) {
steps = 0;
}
Serial.println('\n');
Serial.print("steps: ");
Serial.println(steps);
delay(1000);
}
delay(1000);
// печать результатов на ЖК-дисплее
tft.setCursor(130, 145);
tft.setTextSize(3);
tft.setTextColor(TFT_WHITE);
tft.print(steps);
}
void calibrate() //<---------------------- функция калибровки------------------ --->
{
float sum = 0;
float sum1 = 0;
float sum2 = 0;
for (int i = 0; i < 100; i++) {
xval[i] = float(analogRead(xpin) - 345);
sum = xval[i] + sum;
}
delay(100);
xavg = sum / 100.0;
Serial.println(xavg);
for (int j = 0; j < 100; j++)
{
yval[j] = float(analogRead(ypin) - 346);
sum1 = yval[j] + sum1;
}
yavg = sum1 / 100.0;
Serial.println(yavg);
delay(100);
for (int q = 0; q < 100; q++)
{
zval[q] = float(analogRead(zpin) - 416);
sum2 = zval[q] + sum2;
}
zavg = sum2 / 100.0;
delay(100);
Serial.println(zavg);
}
void senseBack()
{
digitalWrite(13, HIGH);
TSPoint p = ts.getPoint(); // Чтение сенсорного экрана
digitalWrite(13, LOW);
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.y < 305 && p.x < 285 && p.x > 239 && !running)
{
backsensed = true;
}
else
backsensed = false;
}
void startGlu() //-------------------------------startGlu------------ -------------
{
}
void startPulse() //--------------------------------startpulse----------- ------------
{
bufferLength = 100; // длина буфера 100 хранит 4 секунды сэмплов, работающих со скоростью 25sps
//читаем первые 100 выборок и определяем диапазон сигнала
for (byte i = 0 ; i < bufferLength ; i++)
{
while (particleSensor.available() == false) //есть ли у нас новые данные?
particleSensor.check(); //Проверяем датчик на наличие новых данных
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //Мы закончили с этим образцом, поэтому переходим к следующему образцу
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.println(irBuffer[i], DEC);
}
//рассчитать частоту сердечных сокращений и SpO2 после первых 100 образцов (первые 4 секунды образцов)
maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
//Постоянно берем образцы с MAX30102. ЧСС и SpO2 рассчитываются каждую 1 секунду
while (1)
{
//сбрасываем первые 25 наборов сэмплов в память и сдвигаем последние 75 наборов сэмплов наверх
for (byte i = 25; i < 100; i++)
{
redBuffer[i - 25] = redBuffer[i];
irBuffer[i - 25] = irBuffer[i];
}
//возьмем 25 наборов образцов перед расчетом частоты сердечных сокращений.
for (byte i = 75; i < 100; i++)
{
while (particleSensor.available() == false) //есть ли у нас новые данные?
particleSensor.check(); //Проверяем датчик на наличие новых данных
digitalWrite(readLED, !digitalRead(readLED)); // Мигать встроенным светодиодом при каждом чтении данных
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //Мы закончили с этим образцом, поэтому переходим к следующему образцу
//отправляем образцы и результат расчета в терминальную программу через UART
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.print(irBuffer[i], DEC);
Serial.print(F(", HR="));
Serial.print(heartRate, DEC);
Serial.print(F(", HRvalid="));
Serial.print(validHeartRate, DEC);
Serial.print(F(", SPO2="));
Serial.print(spo2, DEC);
Serial.print(F(", SPO2Valid="));
Serial.println(validSPO2, DEC);
}
//После сбора 25 новых образцов пересчитываем HR и SP02
maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
// печать результатов на ЖК-дисплее
tft.setCursor(130,145);
tft.setTextSize(3);
tft.setTextColor(TFT_WHITE);
tft.print(heartRate);
}
}
Пожалуйста, посмотрите выше код, работает ли он так, как я хочу. Я получаю сообщение об ошибке, когда пытаюсь скомпилировать этот код, который приведен ниже.
Мои вопросы:
- правилен ли этот код, если нет, то укажите на мои ошибки.
- Решение ошибки показано на изображении.
@Namra Noor, 👍2
Обсуждение3 ответа
Arduino Uno не хватает SRAM, текущий Rev3 имеет всего 2 КБ. Вы можете обойти это, используя меньше переменных , используйте #define xpin
вместо const int
и т. Д.
Вот статья о том, как уменьшить использование памяти, попробуйте.
Другой вариант-использовать другой микроконтроллер с большим количеством SRAM, по крайней мере 3KB, как Arduino Mega, ESP32. Но сначала попробуйте оптимизировать свою программу, если у вас все равно нет другой неиспользуемой платы.
ПРАВКА:
Вы также можете взглянуть на заголовочные файлы, если вы можете оптимизировать что-либо там.
Хорошо, я пытаюсь сделать этот код оптимизированным., @Namra Noor
@Nimra Я думаю, что вы должны найти правильное количество массивов, сохраняемых в памяти, и правильное количество их, сохраняемых во флэш-памяти, потому что у вас не так много места на флэш-памяти осталось., @Python Schlange
Arduino Mega имеет 8192 байта SRAM, которые решат вашу проблему.
Уменьшите использование оперативной памяти (ref)
Посмотрите на этот пост, где я реализовал часы с помощью tft-сенсорного экрана с сенсорными полями выбора для установки времени. Я использовал Teensy 3.2, который прекрасно справляется с требованиями к памяти. Из отчета о компиляции
Compiling 'Teensy_LCDClockV4' for 'Teensy 3.2 / 3.1'
Using previously compiled file: C:\Users\Frank\AppData\Local\Temp\VMBuilds\Teensy_LCDClockV4\teensy31\Release\pch\Arduino.h.gch
Program size: 117,320 bytes (used 45% of a 262,144 byte maximum) (4.14 secs)
Minimum Memory Usage: 5936 bytes (9% of a 65536 byte maximum)
Так что у вас могут возникнуть некоторые проблемы с установкой его в обычную плату Arduino
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Глобальные переменные занимают много места в динамической памяти.
пожалуйста, без картинок текста.. не у всех есть возможность просматривать картинки... выкладывайте собственно текст, @jsotola
код правильный?
... если он делает то, что вы ожидаете, тода
... иначенет
, @jsotola