Переосмыслил скетч, решил сделать задержку между чтениями данных с датчика.
Добавил флаг, указывающий на актуальность данных, полученных с датчика.
Получился следующий скетч:
Ну, примерно, так оно и будет до тех пор, пока Вы не начнёте читать, что Вам пишут и удалять из кода явные глупости. Пока же такое ощущение, что Вы вообще не читаете, а только пишете сами.
Ответ под вопросом оставили Вы. Кто источник информации в данном ответе - дело второе.
К тому же я новичок, так что распознавать сарказм в теме, в которой не являюсь опытным, не в моих силах (речь о переполнении millis).
Удалил строки 43-45, поведение не изменилось.
В какой-то момент начинает возвращать одни и те же значения
Вам много чего в этом деле непонятно, правда? Я попытаюсь объяснить. Если в системе что-то не работает, и в ней есть явные глупости, от них надо избавляться. Чем меньше останется глупостей (и чем меньше строк кода, кстати), тем скорее всё прояснится.
Я могу Вам помочь, но есть условие. Вы делаете точно то, что я скажу без заявлений, о том, что Вы не понимаете, как это влияет и без лишнего умничанья. Согласны? Я готов помочь, нет - разбирайтесь сами.
/*
Blink without Delay
Turns on and off a light emitting diode (LED) connected to a digital pin,
without using the delay() function. This means that other code can run at the
same time without being interrupted by the LED code.
The circuit:
- Use the onboard LED.
- Note: Most Arduinos have an on-board LED you can control. On the UNO, MEGA
and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN
is set to the correct LED pin independent of which board is used.
If you want to know what pin the on-board LED is connected to on your
Arduino model, check the Technical Specs of your board at:
https://www.arduino.cc/en/Main/Products
created 2005
by David A. Mellis
modified 8 Feb 2010
by Paul Stoffregen
modified 11 Nov 2013
by Scott Fitzgerald
modified 9 Jan 2017
by Arturo Guadalupi
This example code is in the public domain.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay
*/
// constants won't change. Used here to set a pin number:
const int ledPin = LED_BUILTIN; // the number of the LED pin
// Variables will change:
int ledState = LOW; // ledState used to set the LED
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0; // will store last time LED was updated
// constants won't change:
const long interval = 1000; // interval at which to blink (milliseconds)
void setup() {
// set the digital pin as output:
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, if the difference
// between the current time and last time you blinked the LED is bigger than
// the interval at which you want to blink the LED.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
Serial.println(millis());
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
}
Тогда забудьте на время про свои датчики и оставьте пример, который у Вас ходит “неровно”. Только, давайте в нём ошибки поправим и вообще, сделаем его покошернееи поиформативнее:
Код
#define printVar(x) do { Serial.print(#x "="); Serial.print(x); Serial.print("; "); } while (false)
#define printVarLn(x) do { Serial.print(#x "="); Serial.println(x); } while (false)
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
static unsigned long previousMillis = 0;
static constexpr unsigned long interval = 1000;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
printVar(currentMillis);
printVar(previousMillis);
printVarLn(interval);
digitalWrite(LED_BUILTIN, ! digitalRead(LED_BUILTIN));
}
}
Запустите и покажите мне Ваш код и лог из монитора порта.
Под “Ваш код” я понимаю копипасту из Вашего IDE. Выкладывайте его всегда, даже если Вы поменяли одну запятую или вовсе ничего не меняли, а код взяли у меня. Я всегда (без исключений!) должен видеть:
Схема подключения - был бы мой следующий вопрос, но раз уж пошла такая пьянка, то к вопросу о среде и плате, добавляется схема. Полностью, с питанием (или несколькими).
Пока рисуйте схему и описывайте среду, а код для будущих запусков давайте сделаем
Такой
#define printVar(x) do { Serial.print(#x "="); Serial.print(x); Serial.print("; "); } while (false)
#define printVarLn(x) do { Serial.print(#x "="); Serial.println(x); } while (false)
void setup() {
Serial.begin(9600);
Serial.println("Fun begins!");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
static unsigned long previousMillis = 0;
static constexpr unsigned long interval = 1000;
const unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
printVar(currentMillis);
printVar(previousMillis);
printVarLn(interval);
previousMillis = currentMillis;
digitalWrite(LED_BUILTIN, ! digitalRead(LED_BUILTIN));
}
}