Gen.Aleks - как же вы говорите, что мой рецепт "не работает" - когда вы его не пробовали? :) Я ведь вам как сказал? - вариант 1)разнесите показ температур и даты каждый отдельно, а между ними сделайте показ времени. Чтобы было понятно - покажите дату на 5 секунд, потом обычные часы на 10 секунд. Потом покажите температуру на 5 секунд - и снова время на 10 секунд. Потом так же третью температуру. И ничего не будет накладываться.
Есть еще вариант - показывайте дату и обе темпетаруры в одной процедуре.
Вы что-нибудь из этого пробовали? - нет! а пишете "не работает"
И насчет кода . Исходный код не мой. Я в этой ветке появился только на второй или третьей странице. Я лишь помог сделать код чуть менее кривым.
Этот код - плод коллективного творчества. Каждый следующий приходящий в эту ветку стремится затащить в код все новые и новые "полезности" - с его точки зрения. В начальном коде было только время и одна температура. теперь тут и дата. и куча датчиков. и давление и влажность... а один даже меню хотел вставить с кучей функций :) Естесственно, это сказывается на работоспособности :) Я не лезу в эти фантазии и не берусь править код, когда меня не просят - хотя я вижу в нем кучу "узких мест", которые дают такие следсвия. как подтормаживания точек.
А с адресами с температурных датчиков, тоже заморачиватся не буду, закажу с али-экспрес датчик температуры давления и влажности, а мой уличный датчик будет внутри часов, к стати брешит на градус где-то, вода на улице кашица появилась из кресталов а он ниже нуля не опускался решил вопрос легко t = temperature - 1; сейчас хочу с часовым термометром такой же фокус провернуть, тот брешит аш на 5 градусов наверно светодиоды нагрели хотя ночью греться будет меньше светодиоды еле горят. Ещё цвета не все с одинаковой яркостью горят красный меньше всего на самой маленькой яркости. Как бы откалибровать?
по крайней мере с уличным термометром так делать нельзя. температура в минус уходит и теплее -1 не будет))
Gen.Aleks - как же вы говорите, что мой рецепт "не работает" - когда вы его не пробовали? :) Я ведь вам как сказал? - вариант 1)разнесите показ температур и даты каждый отдельно, а между ними сделайте показ времени. Чтобы было понятно - покажите дату на 5 секунд, потом обычные часы на 10 секунд. Потом покажите температуру на 5 секунд - и снова время на 10 секунд. Потом так же третью температуру. И ничего не будет накладываться.
Самое главное нет опорной точки отсчёта: Закажешь через 10 секунд он через 20 по 2с морганием точек включится. Вообщем это мой самый лучший вариант точки мигают как камертон вся информация уличная домашняя температура, день недели, число, месяц, год, между информициями помежуток секунда во время которого иногда появляется время- это единственный минус который мне не удалось ещё победить. Наверно есть способ через массив как то сделать, но что то не найду.
#include <RTC.h>
RTC time;
#include <DS3231.h>
#include <OneWire.h>
#include <TroykaLight.h>
/*
Подключение к Arduino nano:
Часы DS3231: SCL -> A5
SDA -> A4
Датчик освещения -> A3
Кнопки: Смена часов -> D2
Смена минут -> D3
Смена цвета -> D4
Лента WS2811(WS2812)-> D13
*/
//---------------------------------------------------------------------------------------------------
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>
#define RTC_DS3231 1
#define LEDS_IN_SEGMENT 3 // Задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2 // Задаём сколько у нас разделительных точек
#define COLOR_CHANGE 2 // Смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define NUM_COLORS 16 // Количество цветов
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // Пин ленты
#define BRI_PIN A3 // PIN фоторезистора
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 250 // максимальная яркость (0 - 255)
#define min_bright 2 // минимальная яркость (0 - 255)
#define bright_constant 1000 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define s 4000 //Время отображения информации
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
int temperature = 0;
int Tout1;
int den;
int ned;
OneWire ds(5); // Объект OneWire
long vrem_izm = 0; // Переменная для хранения времени последнего считывания с датчика
long vrem1 = 0;
const int period_izm = 1000; // Определяем периодичность проверок
const int per1 = 1000;
//---------------------------------------------------------------------------------------------------
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
//---------------------------------------------------------------------------------------------------
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b00011110, // Digit C 11
0b01000000, // Digit - 12
};
//---------------------------------------------------------------------------------------------------
bool Dot = true;
bool TempShow = true;
bool DenChisloShow = true;
bool TempOutShow = true;
bool MesGodShow = true;
int last_digit = 0;
//---------------------------------------------------------------------------------------------------
long ledColor = CRGB::Aqua; // Используемый цвет
long ColorTable[NUM_COLORS] = {
CRGB::Amethyst,
CRGB::Aqua,
CRGB::Blue,
CRGB::Chartreuse,
CRGB::DarkGreen,
CRGB::DarkMagenta,
CRGB::DarkOrange,
CRGB::DeepPink,
CRGB::Fuchsia,
CRGB::Gold,
CRGB::GreenYellow,
CRGB::LightCoral,
CRGB::Tomato,
CRGB::Red,
CRGB::Orchid,
CRGB::DarkOrchid
};
//---------------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
// инициализация модуля RTC
time.begin(RTC_DS3231); // на базе чипа DS3231 модуль подключается к аппаратным выводам I2C
Wire.begin();
LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
//---------------------------------------------------------------------------------------------------
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка смены минут
pinMode(2, INPUT_PULLUP); // Кнопка смены часов
}
//---------------------------------------------------------------------------------------------------
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
}
}
//---------------------------------------------------------------------------------------------------
void BrightDigit (uint8_t digit, uint8_t cursor)
{
for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
{
for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
{
leds[cursor] = (digit & mask) ? ledColor : 0;
cursor ++;
}
}
}
//---------------------------------------------------------------------------------------------------
//Массив управления яркостью
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сброить таймер
new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright); // считать показания с фоторезистора, перевести диапазон
new_bright = constrain(new_bright, min_bright, max_bright);
new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
LEDS.setBrightness(new_bright_f); // установить новую яркость
}
}
};
//---------------------------------------------------------------------------------------------------
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
//if (time.seconds % 2 == 0)
if ((millis() - vrem1) > per1) //Где long vrem_izm = 0; // Переменная для хранения времени последнего считывания с датчика
//const int period_izm = 1000; // Определяем периодичность проверок
{
vrem1 = millis();
Dot = false;
}
else {
Dot = true;
}
return (hour * 100 + minute);
}
//---------------------------------------------------------------------------------------------------
// Преобразуем время в массив для отображание
void TimeToArray() {
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // Получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= 2;
}
if ( (i != 4) || (digit != 0)) BrightDigit(digits[digit], cursor);
else BrightDigit(0, cursor);
if ( i == COLOR_CHANGE) {
if (digit != last_digit)
{
// cylon (); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
//---------------------------------------------------------------------------------------------------
// Функция вывода температуры на улице
//********************************************
void detectTemperature()
{
byte data[2]; // Место для значения температуры
ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
ds.write(0x44); //Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
if (millis() - vrem_izm > period_izm)
{
vrem_izm = millis();
ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
data[0] = ds.read(); // Читаем младший байт значения температуры
data[1] = ds.read(); // А теперь старший
// Формируем значение
temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4; // Темпиратура правильная.
}
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30)
{
TempOutShow = false;
return;
};
TempOutShow = true;
int t = temperature;
BrightDots(0); //разделительные мигающие точки выключены
if (t >= 0) // температура положительная
{
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // знак градус (*) 3й блок
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // знак Цельсия (*) 4й блок
int digit = t % 10; //пример: 24 % 10 остаток 4 - это единицы темпиратуры
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2 блок единицы градуса
t /= 10; // тоже самое, но получаем десятки темпиратуры
digit = t % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок вывода первого символаo
}
else if (t < 0) // температура отрицательная
{Tout1 = abs(t); // //преобразование отрицательного числа в положительное
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // знак градус (*) 4й блок
int digit = Tout1 % 10; //пример: 24 % 10 остаток 4 - это единицы темпиратуры
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // 3й блок единицы градуса
Tout1 /= 10; // тоже самое, но получаем десятки темпиратуры
digit = Tout1 % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок вывода первого символа
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок вывода знака "-"
}
}
// Функция вывода температуры в комнате
//*******************************************
void TempToArray()
{
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 35)
{
TempShow = false;
return;
}
TempShow = true;
int t = RTC.temperature();
int celsius = (t / 4.0)-5;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // начало знака Цельсия (С) 4й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // начало знака Градус (*) 3й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок вывода первого символа
};
// Функция вывода ДЕНЬ ЧИСЛО
//**************************************
void DenChisloToArray(){
time.gettime();
int d = time.day;
delay(100);
time.gettime();
int n = time.weekday;
delay(100);
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 40)
{
DenChisloShow = false;
return;
}
DenChisloShow = true;
BrightDots(0); //разделительные мигающие точки выключены
den = d;
int digit = den % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // 4й блок единицы дней
den /= 10;
digit = den % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // 3й блок десятки дне
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок вывода знака "-"
ned = n;
digit = ned % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок день недели
}
//Функция вывода года Месяц,Год
//************************************
void MesGodToArray(){
time.gettime();
int m = time.month;
delay(100);
time.gettime();
int g = time.year;
delay(100);
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 45)
{
MesGodShow = false;
return;
}
MesGodShow = true;
BrightDots(0); //разделительные мигающие точки выключены
int god = g;
int digit = god % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // 4й блок единицы года
god /= 10;
digit = god % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // 3й блок десятки года
int mes = m;
digit = mes % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок вывода единиц месяца
mes /= 10;
digit = mes % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок вывода десятка месяца
}
//-------------------------------
//смена цвета кнопкой DST пин D4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(200);
};
//---------------------------------------------------------------------------------------------------
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
if (buttonH == LOW || buttonM == LOW) {
delay(200);
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minutes = Now.Minute;
int second = Now.Second;
if (buttonH == LOW) {
if (Now.Hour == 23) {
Now.Hour = 0;
}
else {
Now.Hour += 1;
};
}
else
{
if (Now.Minute == 59) {
Now.Minute = 0;
}
else {
Now.Minute += 1;
};
};
RTC.write(Now);
}
}
//---------------------------------------------------------------------------------------------------
//Меняем эффекты
void fadeall() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250);
}
}
//---------------------------------------------------------------------------------------------------
// массив отвечает за цикличное изменение цветов
void cylon () {
static uint8_t hue = 0;
Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
Serial.print("x");
//---------------------------------------------------------------------------------------------------
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
}
//---------------------------------------------------------------------------------------------------
void loop() {
BrightnessCheck(); // Проверяем датчик
DSTcheck(); // Проверяем режимы
TimeAdjust(); // Проверяем время если сменилось на 1 цифру
TimeToArray(); // Проверяем часы если сменилось на 1 цифру
detectTemperature(); // Проверяем температуру от датчика DS18b20
TempToArray(); // температура в помещении
DenChisloToArray() ; // Проверяем день и число
MesGodToArray(); // Проверяем месяц и год
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true) delay (s); // время отображения температуры
if ( TempOutShow == true) delay (s); // время отображения температуры на улице
if ( DenChisloShow == true) delay (s); // время отображения числа и дня
if ( MesGodShow == true) delay (s); //время отображения месяц и год
}
так и есть - сами себя цитируете, себе же и отвечаете :) шутка.
Если серьезно - не все пенсионеры. некоторые работают. Пока только мельком посмотрел код и вижу что вы опять не х... нифига не поняли. Неужели так непонятно обьясняю?
У RTC-шек есть аппаратный выход SQ
Его можно настроить на выдачу секундных импульсов. Его и дублировать на светики.
Только нужно убрать из кода все delay-и.
У меня так было сделано пока я не сделал
так, чтобы контроллер считал миллисекунды самостоятельно и раз в 1000
своих миллисекунд читает время из RTC-хи.
А вызвано это было тем, что с завода RTC-ха вообще не тикает и по этому программу нельзя привязывать к её тиканью.
Если RTC-ха вообще не припаяна, то мой скетч прекрасно обходится и без неё, правда точность ощутимо похуже.
b707 скажи пожалуйста где по человечески (по русски) описаны вот эти строки в библиотеке:
не знаю, никогда не интересовался. Попробуй вбить в гугль название библиотеки - вот оно указано в заголовке скетча:
#include <RTC.h>
В гугле точно найдешь исходный код либы, возможно там и описание есть. Или может гугль тебе найдет какую-то статью по использованию этого кода. Но только с вероятностью процентов в 90 это будет на английском. В программировании без английского никуда. А для незнающих человеческий язык (английский) есть гуглопереводчик
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
Хотел избавится от библиотеки #include <DS3232RTC.h> изругнулся скетч типа ардуино нано чо-то-там с регистрацией. Ну вообщем тёмный лес. Эта библиотека со скетчем шла я чтото боюсь что работать не будет. А с новой библиотекой такую красоту не сделаю)).
По этому я спросил про строки:
tmElements_t tm;
RTC.read(tm);
В библиотеке #include <RTC.h> я чтото не нашёл tmElements_t tm;
Или в скетче написать на какой частоте работает ардуино нано это наверное вернее будет. Автоматически не определяет.
Или в скетче написать на какой частоте работает ардуино нано это наверное вернее будет. Автоматически не определяет.
отвечу на это - остальное какой-то бред. разбираться не буду.
Если б у вас была неверная частота контроллера - у вас бы искажение времени было бы в два раза, а не на 8 секунд в минуту. Причина ваших проблем - что на самом деле каждый кусок. который вы считаете "по 5 секунд" - на самом деле исполняется дольше из-за delay-ев. которые в изобилии напиханы в коде.
А теперь в общем. Можно не читать. Наболело!
Мужики! Почему вы все уверены. что сможете поправить чужой код, ничего не смысля в программировании? Наверно единственный человек за всю эту ветку. который по-настоящему разобрался в коде, задавал умные вопросы и в итоге создал грамотный скетч - это Одиночка. Все остальные либо добавляли в код свои ошибки. либо просто вопили "Помогите!".
Не умеете программировать - берите готовый код. например от Одиночки. Считаете, что он вам не подходит и вы можете лучше - так разбирайтесь и правьте сами! А сейчас получается - "я хочу сделать часы, готовый код меня не устраивает, у меня такого-то датчика нет... программирование не знаю и учиться не хочу... " ... и начинаем задавать бесконечные тупые вопросы в ветке и "выдавать на гора" все более и более кривые версии кода, засоряя ветку и создавая проблемы для тех, кто потом захочет это повторить.
Если кому нужны часы с "блек-джеком и девочками", с десятком термометров, десятью датами и прочая и прочая... закажите b612 готовую прошивку - он по таким извращениям мастер.
Ребят требуется помощь зала)). Я сделал мигание точек вот так per1=1000.
получается после четырёх отображений информации по 5 сек.=20 сек. Остаётся 40 секунд. Как сделал b707 между информации 22 сек.
(мигании точек). Как я сделал 33 сек. но это мало надо 40, изменение периода per1=1000 увеличить можно, но уменьшить нельзя после
per1 = 800 отображение точек совсем прекращается. Может здесь что-то изменить: if ((millis() - vrem1) > per1)
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
//if (second % 2 == 0)
if ((millis() - vrem1) > per1)
{
vrem1 = millis();
Dot = false;
}
else {
Dot = true;
}
return (hour * 100 + minute);
}
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
достаточно вот этого
#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с самим временем
не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так
void loop() { // главный цикл
//застолбим время
LooperTime = millis();
основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда
if (oldMillis != *ptrMillis8) {
oldMillis = *ptrMillis8;
mSekunda = true; //Флажок, что миллисекунда новая
};
таким же образом формируем флажки для каждых 30мс для обзона кнопок
Можно для этих целей воспользовать библу "Timer master"
она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime
b707 специально для тебя замерил время отображения информации секундомером, она составляет 4,46 с. + реакция на нажатие кнопки
и так 4 информации 20 с при чём здесь делаи. Точки привязаны к часам в моём скетче были. Сейчас я пытаюсь привязать к счётчику.
В теме о Часах я разговариваю про часы, вроде логично или здесь институт блогородных девиц кидающих цитаты из умных учебников и заставляющих учится.
К стати о моих хотелках, я хотел сделать чтобы точки отображались с секундомером, номер не удался отображается число в момент проверки(к стати время включения информации о секундах соответствует времени через сколько должна включится информация, это ещё раз доказывает что делаи не причём) и 4 секунды не считает.
И вторая, кнопка которая при работающих секундах обнуляет их (останавливает часы) и при отпускании кнопки запускает это при колибровке пригодилось-бы (Как на часах Электроника-7)
Gen.Alex, цитата из вашего кода: #define s 4000 Вы идиот? Нафига пишете в код строки, в которых ни черта не понимаете?
Зачем столько эмоций ? Видно же что человек совсем новичок.
Надо просто объяснить, что дефайн это замена одной строки на другую, более выразительную по внешнему виду.
В данном случае безликая строка "4000" заменяется на почти столь же безликую букву "s"
Да к тому же такая простая буква может запросто пересечься с какой-нибудь переменной с именем "s".
B612, а вы то сами понимаете что эта строка делает? Что-то я начинаю сомневаться:)
Человек не просто новичок, а тупой ленивый неуч. Он лезет править код, абсолютно не вникая, что он значит, а на все отсылки хоть что-то почитать - огрызается.
допусим.
Мои дети такие же. Но если я буду сообщать им только это, а заодно посылать в глухие непонятные дебри, то у них пропадёт желание заниматься, а так же общаться со мной.
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
достаточно вот этого
#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с самим временем
не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так
void loop() { // главный цикл
//застолбим время
LooperTime = millis();
основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда
if (oldMillis != *ptrMillis8) {
oldMillis = *ptrMillis8;
mSekunda = true; //Флажок, что миллисекунда новая
};
таким же образом формируем флажки для каждых 30мс для обзона кнопок
Можно для этих целей воспользовать библу "Timer master"
она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime
Вот за это всё спасибо, буду теперь переваривать всё это.
Gen.Alex, цитата из вашего кода: #define s 4000 Вы идиот? Нафига пишете в код строки, в которых ни черта не понимаете?
Зачем столько эмоций ? Видно же что человек совсем новичок.
Надо просто объяснить, что дефайн это замена одной строки на другую, более выразительную по внешнему виду.
В данном случае безликая строка "4000" заменяется на почти столь же безликую букву "s"
Да к тому же такая простая буква может запросто пересечься с какой-нибудь переменной с именем "s".
Видео Урок программирования микроконтроллеров AVR рулит. К стати, работает. " Нафига пишете в код строки"- есть притензии так скажи. Буква "s" ни как не отразилась на часах просто писать меньше. Сейчас научусь со временем работать как "b612" может код поменьше будет. А тебе может ссылку на урок по програмированию AVR посмотри и там поругайся чтоб не учил народ чему не надо. Вот тебе поучись https://diodov.net/migayushhij-svetodiod-programmirovanie-mikrokontrollerov-avr/
Чувствую что нужно заводить пару тем. Типа, часы и половое бессилие... Либо, влияние часов на развитие пандемии... Не? Глобальные ведь проблемы!))) Это ж надо, сколько сил то людских тратится на какие то часы!))) Вот так вот жизнь то и проходит...
А, кстати. Видать не зря мне человек заказывал обратный таймер. Типа, вот осталось то столько то времени до какой то даты. Причем, поначалу он хотел даже индикацию в миллисекундах. С тем что бы было видно как быстро течёт время. Ага?
Или в скетче написать на какой частоте работает ардуино нано это наверное вернее будет. Автоматически не определяет.
отвечу на это - остальное какой-то бред. разбираться не буду.
Если б у вас была неверная частота контроллера - у вас бы искажение времени было бы в два раза, а не на 8 секунд в минуту. Причина ваших проблем - что на самом деле каждый кусок. который вы считаете "по 5 секунд" - на самом деле исполняется дольше из-за delay-ев. которые в изобилии напиханы в коде.
А теперь в общем. Можно не читать. Наболело!
Мужики! Почему вы все уверены. что сможете поправить чужой код, ничего не смысля в программировании? Наверно единственный человек за всю эту ветку. который по-настоящему разобрался в коде, задавал умные вопросы и в итоге создал грамотный скетч - это Одиночка. Все остальные либо добавляли в код свои ошибки. либо просто вопили "Помогите!".
Не умеете программировать - берите готовый код. например от Одиночки. Считаете, что он вам не подходит и вы можете лучше - так разбирайтесь и правьте сами! А сейчас получается - "я хочу сделать часы, готовый код меня не устраивает, у меня такого-то датчика нет... программирование не знаю и учиться не хочу... " ... и начинаем задавать бесконечные тупые вопросы в ветке и "выдавать на гора" все более и более кривые версии кода, засоряя ветку и создавая проблемы для тех, кто потом захочет это повторить.
Если кому нужны часы с "блек-джеком и девочками", с десятком термометров, десятью датами и прочая и прочая... закажите b612 готовую прошивку - он по таким извращениям мастер.
b707, я удивляюсь вашему терпению, 200 последних постов просто ни о чём, повторю что нормальный рабочий
код который бес проблем переделывается под все хотелки лежит в посту #113, хотя вы сказали что это не ваш код.
b612 открой тему в готовых проэктах и выкладывай там свои скетчи на тысячи строк, как написал b707 с"блек-джеком и девочками", с десятком термометров и т.д. которые не кому не пригодятся, только поиграться.
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
достаточно вот этого
#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с самим временем
не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так
void loop() { // главный цикл
//застолбим время
LooperTime = millis();
основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда
if (oldMillis != *ptrMillis8) {
oldMillis = *ptrMillis8;
mSekunda = true; //Флажок, что миллисекунда новая
};
таким же образом формируем флажки для каждых 30мс для обзона кнопок
Можно для этих целей воспользовать библу "Timer master"
она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime
Вот за это всё спасибо, буду теперь переваривать всё это.
Заколебало, хоть пример откомпелированный привёл одна теория флашками махал махал целый день. Всё назад вернул не получается.
Заколебало, хоть пример откомпелированный привёл одна теория флашками махал махал целый день. Всё назад вернул не получается.
так всегда по первой каждый шажок даётся большим трудом.
Я специально надёргал из своего кода только те строчки которые вам нужны для понимания теории
если я выложу весь код, вас стошнит от его объёма инепонятности )
Основная идея в том, что
1. по сути вы всегда строите многозадачную систему и нужно делать так, чтобы задачи были максимально независимыми друг от друга
2. алгоритм должен быть ориентирован на объекты, и события, связанные с объектами
3. Поскольку каждая задача самостоятельна, то главный цикл должен крутиться максимально быстро, чтобы каждая задача как можно меньше времени ждала своей очереди.
4. соответственно процедуры, вызываемые из главного цикла должны выполняться без задержек
5. действия в пределах одного прохода не должны повторяться,
6. на главный цикл ещё накладываются некоторые типа административные обязанности, типа отдавать управление каждой задаче не просто по очереди, а по определённому стечению обстоятельств (времени, событий каких-нибудь флажков).
Это вы вызываете рассчет этих циферок и пользуете их прямо на месте преступления, а мне они нужны как аргументы каждые 10мсек при том, что изменяются они раз в секунду.
Вот по этому они есть и глобальные.
Переполнение есть, но в данном случае оно
вызывает только вашу когнитивную ошибку.
код отрабатывается корректно
if (uint8_t(*ptrMillis8 - oldMillis32) >= 32) {
oldMillis32 = oldMillis32 + 32;
к примеру uint8_t(255 - 254) даст 1, это будет < 32 uint8_t(000 - 254) даст, как ни странно, 2, это будет по прежнему < 32
uint8_t(030 - 254) даст 32, это будет >= 32 , условие сработает и
к 254 сразу прибавится 32 и получится 030
и далее
uint8_t(031 - 030) опять даст 1, это будет по прежнему < 30
ЗЫ: не пердежу, не попёрдыванию, а именно пердению )
b612 мы с вами наверно ближе по возрасту мне 50 дочь замужем, сын в армию пойдёт, у вас тоже дети, я бы хотел не в рамках форума пообщаться, чтобы не засарять эфир как говорится. Часы чёрт с ними если у всех нормально идут наверно китайцы ардуино нано с кварцем другим подсунули я слышал на форумах бывает такое, а конкретно встретил вас на форуме где вы делали драйвер из ардуинки для компьютерной программы осцилографа, я работаю на заводе и мне для ремонта приводов требуется по возможности маленький осцилограф и не важно большую частоту чтоб он ловил буквально от 0 до 100 Гц но чтоб чётко ловил меандр и постоянное напряжение, до кучи в этот прибор хочу воткнуть и частотомер, задатчик скорости для длигателей постоянного тока. генератор частоты тоже всё без фанатизма. простенький, ну если уж получится определитель короткозамкнутых витков в моторах. А то приходится ремонтировать не отходя от станка и пока принесёшь все приборы полдня пройдёт а так положил в карман и готово. Так как ноубук нам ещё не купили заинтересовала меня тема с жидкокресталическими дисплеями от сотового телефона и ардуино нано, у меня есть дисплей от не работающего телефона Alcatel BF4 весь итернет перерыл не могу найти ни схему телефона ни цокалёвку дисплея, фирма французская. Вот фото дисплея, может кто даст наводку как определить цоколёвку:
а конкретно встретил вас на форуме где вы делали драйвер из ардуинки для компьютерной программы осцилографа
это наверно был не я. Но я делал кардиограф с выводом кардиограммы через блютус на андроид.
Gen.Aleks пишет:
по возможности маленький осцилограф и не важно большую частоту чтоб он ловил буквально от 0 до 100 Гц но чтоб чётко ловил меандр и постоянное напряжение, до кучи в этот прибор хочу воткнуть и частотомер, задатчик скорости для длигателей постоянного тока. генератор частоты тоже всё без фанатизма. простенький, ну если уж получится определитель короткозамкнутых витков в моторах.
для работы то проще наверно купить портативный осциллограф. Но если интересно, то почему-бы нет. Всё это даже не сложно.
Хотя мне уже поднадоели эти мелкие глупые проекты.
Выжимать из АЦП ардуины несчастные килосэмплы после того как научился синтезировать на ней нормальный звук..
Уже давненько мечтаю оседлать нейросети.
Что касается экранчика, на али 200р совершенно понятные экранчики на любой вкус. Чем париться искать даташит да потом программировать этот единственный экранчик а потом случайно его сжечь
Что то уже самому расхотелось. Точно лучше купить.Вот b612 это был ты))).
точно, я !
это вот как раз про кардиограф было или может даже ещё про фолль
как давно это было !
Сейчас есть в планах сделать на таком ЖК-шнике свой "сталкер" (фонарь-таймер-градусник-сторож)
Прототип уже во всю трудится в районе кухни, но он здоровенный и тяжелый и светики слабенькие.
Уже приехал и ЖК-шник и светик CreeXM и мощный светик с глубоким УФ, дело за моделью корпуса.
Добрый день! Люди может кто подскажет собрал часы на ds1307 все работало, выключил питание включил теперь показывают 8954 и всё, весь день ковыряюсь. может модуль накрылся?
Gen.Aleks - как же вы говорите, что мой рецепт "не работает" - когда вы его не пробовали? :) Я ведь вам как сказал? - вариант 1)разнесите показ температур и даты каждый отдельно, а между ними сделайте показ времени. Чтобы было понятно - покажите дату на 5 секунд, потом обычные часы на 10 секунд. Потом покажите температуру на 5 секунд - и снова время на 10 секунд. Потом так же третью температуру. И ничего не будет накладываться.
Есть еще вариант - показывайте дату и обе темпетаруры в одной процедуре.
Вы что-нибудь из этого пробовали? - нет! а пишете "не работает"
И насчет кода . Исходный код не мой. Я в этой ветке появился только на второй или третьей странице. Я лишь помог сделать код чуть менее кривым.
Этот код - плод коллективного творчества. Каждый следующий приходящий в эту ветку стремится затащить в код все новые и новые "полезности" - с его точки зрения. В начальном коде было только время и одна температура. теперь тут и дата. и куча датчиков. и давление и влажность... а один даже меню хотел вставить с кучей функций :) Естесственно, это сказывается на работоспособности :) Я не лезу в эти фантазии и не берусь править код, когда меня не просят - хотя я вижу в нем кучу "узких мест", которые дают такие следсвия. как подтормаживания точек.
В конце концов. у каждого своя голова.
А с адресами с температурных датчиков, тоже заморачиватся не буду, закажу с али-экспрес датчик температуры давления и влажности, а мой уличный датчик будет внутри часов, к стати брешит на градус где-то, вода на улице кашица появилась из кресталов а он ниже нуля не опускался решил вопрос легко t = temperature - 1; сейчас хочу с часовым термометром такой же фокус провернуть, тот брешит аш на 5 градусов наверно светодиоды нагрели хотя ночью греться будет меньше светодиоды еле горят. Ещё цвета не все с одинаковой яркостью горят красный меньше всего на самой маленькой яркости. Как бы откалибровать?
по крайней мере с уличным термометром так делать нельзя. температура в минус уходит и теплее -1 не будет))
Таймер на точки тоже свой пришлось делать
тогда сделай показ по времени только даты. а температуры показывай после даты подряд не по времени, а по признаку DenChisloShow == true
только внутри самих процедур вычисления температуры проверку времени надо тоже выкинуть
Слеплять вместе и так и сяк пробовал не плучается, в дипрессию скетч уходит)).
тогда сделай показ по времени только даты. а температуры показывай после даты подряд не по времени, а по признаку DenChisloShow == true
только внутри самих процедур вычисления температуры проверку времени надо тоже выкинуть
по поводу вычисления времени проверки температур я сделал как в примере без delay предложили, обойтись якобы так лутчай)).
Gen.Aleks - как же вы говорите, что мой рецепт "не работает" - когда вы его не пробовали? :) Я ведь вам как сказал? - вариант 1)разнесите показ температур и даты каждый отдельно, а между ними сделайте показ времени. Чтобы было понятно - покажите дату на 5 секунд, потом обычные часы на 10 секунд. Потом покажите температуру на 5 секунд - и снова время на 10 секунд. Потом так же третью температуру. И ничего не будет накладываться.
Самое главное нет опорной точки отсчёта: Закажешь через 10 секунд он через 20 по 2с морганием точек включится. Вообщем это мой самый лучший вариант точки мигают как камертон вся информация уличная домашняя температура, день недели, число, месяц, год, между информициями помежуток секунда во время которого иногда появляется время- это единственный минус который мне не удалось ещё победить. Наверно есть способ через массив как то сделать, но что то не найду.
Такое впечатление сам с собой разговариваю)). Пошёл дела делать.
Такое впечатление сам с собой разговариваю)).
так и есть - сами себя цитируете, себе же и отвечаете :) шутка.
Если серьезно - не все пенсионеры. некоторые работают. Пока только мельком посмотрел код и вижу что вы опять не х... нифига не поняли. Неужели так непонятно обьясняю?
b707 скажи пожалуйста где по человечески (по русски) описаны вот эти строки в библиотеке:
tmElements_t tm;
У RTC-шек есть аппаратный выход SQ
Его можно настроить на выдачу секундных импульсов. Его и дублировать на светики.
Только нужно убрать из кода все delay-и.
У меня так было сделано пока я не сделал
так, чтобы контроллер считал миллисекунды самостоятельно и раз в 1000
своих миллисекунд читает время из RTC-хи.
А вызвано это было тем, что с завода RTC-ха вообще не тикает и по этому программу нельзя привязывать к её тиканью.
Если RTC-ха вообще не припаяна, то мой скетч прекрасно обходится и без неё, правда точность ощутимо похуже.
b707 скажи пожалуйста где по человечески (по русски) описаны вот эти строки в библиотеке:
не знаю, никогда не интересовался. Попробуй вбить в гугль название библиотеки - вот оно указано в заголовке скетча:
#include <RTC.h>
В гугле точно найдешь исходный код либы, возможно там и описание есть. Или может гугль тебе найдет какую-то статью по использованию этого кода. Но только с вероятностью процентов в 90 это будет на английском. В программировании без английского никуда. А для незнающих человеческий язык (английский) есть гуглопереводчик
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
Хотел избавится от библиотеки #include <DS3232RTC.h> изругнулся скетч типа ардуино нано чо-то-там с регистрацией. Ну вообщем тёмный лес. Эта библиотека со скетчем шла я чтото боюсь что работать не будет. А с новой библиотекой такую красоту не сделаю)).
По этому я спросил про строки:
tmElements_t tm;
RTC.read(tm);
В библиотеке #include <RTC.h> я чтото не нашёл tmElements_t tm;
Или в скетче написать на какой частоте работает ардуино нано это наверное вернее будет. Автоматически не определяет.
Или в скетче написать на какой частоте работает ардуино нано это наверное вернее будет. Автоматически не определяет.
отвечу на это - остальное какой-то бред. разбираться не буду.
Если б у вас была неверная частота контроллера - у вас бы искажение времени было бы в два раза, а не на 8 секунд в минуту. Причина ваших проблем - что на самом деле каждый кусок. который вы считаете "по 5 секунд" - на самом деле исполняется дольше из-за delay-ев. которые в изобилии напиханы в коде.
А теперь в общем. Можно не читать. Наболело!
Мужики! Почему вы все уверены. что сможете поправить чужой код, ничего не смысля в программировании? Наверно единственный человек за всю эту ветку. который по-настоящему разобрался в коде, задавал умные вопросы и в итоге создал грамотный скетч - это Одиночка. Все остальные либо добавляли в код свои ошибки. либо просто вопили "Помогите!".
Не умеете программировать - берите готовый код. например от Одиночки. Считаете, что он вам не подходит и вы можете лучше - так разбирайтесь и правьте сами! А сейчас получается - "я хочу сделать часы, готовый код меня не устраивает, у меня такого-то датчика нет... программирование не знаю и учиться не хочу... " ... и начинаем задавать бесконечные тупые вопросы в ветке и "выдавать на гора" все более и более кривые версии кода, засоряя ветку и создавая проблемы для тех, кто потом захочет это повторить.
Если кому нужны часы с "блек-джеком и девочками", с десятком термометров, десятью датами и прочая и прочая... закажите b612 готовую прошивку - он по таким извращениям мастер.
Все, в эту ветку больше заходить не хочу.
Ребят требуется помощь зала)). Я сделал мигание точек вот так per1=1000.
получается после четырёх отображений информации по 5 сек.=20 сек. Остаётся 40 секунд. Как сделал b707 между информации 22 сек.
(мигании точек). Как я сделал 33 сек. но это мало надо 40, изменение периода per1=1000 увеличить можно, но уменьшить нельзя после
per1 = 800 отображение точек совсем прекращается. Может здесь что-то изменить: if ((millis() - vrem1) > per1)
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так
основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда
таким же образом формируем флажки для каждых 30мс для обзона кнопок
так же формируем флажки для полусекунд и секунд
И дальше с готовыми флажками и считанным временем уже решаем
какие процедурки вызывать
в конце цикла все флажки надо сбросить
Можно для этих целей воспользовать библу "Timer master"
она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime
b707 специально для тебя замерил время отображения информации секундомером, она составляет 4,46 с. + реакция на нажатие кнопки
и так 4 информации 20 с при чём здесь делаи. Точки привязаны к часам в моём скетче были. Сейчас я пытаюсь привязать к счётчику.
В теме о Часах я разговариваю про часы, вроде логично или здесь институт блогородных девиц кидающих цитаты из умных учебников и заставляющих учится.
К стати о моих хотелках, я хотел сделать чтобы точки отображались с секундомером, номер не удался отображается число в момент проверки(к стати время включения информации о секундах соответствует времени через сколько должна включится информация, это ещё раз доказывает что делаи не причём) и 4 секунды не считает.
И вторая, кнопка которая при работающих секундах обнуляет их (останавливает часы) и при отпускании кнопки запускает это при колибровке пригодилось-бы (Как на часах Электроника-7)
Gen.Alex, цитата из вашего кода:
#define s 4000
Вы хоть понимаете, что она делает?
Вы идиот? Нафига пишете в код строки, в которых ни черта не понимаете?
Надо просто объяснить, что дефайн это замена одной строки на другую, более выразительную по внешнему виду.
В данном случае безликая строка "4000" заменяется на почти столь же безликую букву "s"
Да к тому же такая простая буква может запросто пересечься с какой-нибудь переменной с именем "s".
B612, а вы то сами понимаете что эта строка делает? Что-то я начинаю сомневаться:)
Человек не просто новичок, а тупой ленивый неуч. Он лезет править код, абсолютно не вникая, что он значит, а на все отсылки хоть что-то почитать - огрызается.
Мои дети такие же. Но если я буду сообщать им только это, а заодно посылать в глухие непонятные дебри, то у них пропадёт желание заниматься, а так же общаться со мной.
В данном случае желание общаться пропадает в первую очередь у меня.
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так
основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда
таким же образом формируем флажки для каждых 30мс для обзона кнопок
так же формируем флажки для полусекунд и секунд
И дальше с готовыми флажками и считанным временем уже решаем
какие процедурки вызывать
в конце цикла все флажки надо сбросить
Можно для этих целей воспользовать библу "Timer master"
она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime
Вот за это всё спасибо, буду теперь переваривать всё это.
Надо просто объяснить, что дефайн это замена одной строки на другую, более выразительную по внешнему виду.
В данном случае безликая строка "4000" заменяется на почти столь же безликую букву "s"
Да к тому же такая простая буква может запросто пересечься с какой-нибудь переменной с именем "s".
Видео Урок программирования микроконтроллеров AVR рулит. К стати, работает. " Нафига пишете в код строки"- есть притензии так скажи. Буква "s" ни как не отразилась на часах просто писать меньше. Сейчас научусь со временем работать как "b612" может код поменьше будет. А тебе может ссылку на урок по програмированию AVR посмотри и там поругайся чтоб не учил народ чему не надо. Вот тебе поучись https://diodov.net/migayushhij-svetodiod-programmirovanie-mikrokontrollerov-avr/
Чувствую что нужно заводить пару тем. Типа, часы и половое бессилие... Либо, влияние часов на развитие пандемии... Не? Глобальные ведь проблемы!))) Это ж надо, сколько сил то людских тратится на какие то часы!))) Вот так вот жизнь то и проходит...
А, кстати. Видать не зря мне человек заказывал обратный таймер. Типа, вот осталось то столько то времени до какой то даты. Причем, поначалу он хотел даже индикацию в миллисекундах. С тем что бы было видно как быстро течёт время. Ага?
Или в скетче написать на какой частоте работает ардуино нано это наверное вернее будет. Автоматически не определяет.
отвечу на это - остальное какой-то бред. разбираться не буду.
Если б у вас была неверная частота контроллера - у вас бы искажение времени было бы в два раза, а не на 8 секунд в минуту. Причина ваших проблем - что на самом деле каждый кусок. который вы считаете "по 5 секунд" - на самом деле исполняется дольше из-за delay-ев. которые в изобилии напиханы в коде.
А теперь в общем. Можно не читать. Наболело!
Мужики! Почему вы все уверены. что сможете поправить чужой код, ничего не смысля в программировании? Наверно единственный человек за всю эту ветку. который по-настоящему разобрался в коде, задавал умные вопросы и в итоге создал грамотный скетч - это Одиночка. Все остальные либо добавляли в код свои ошибки. либо просто вопили "Помогите!".
Не умеете программировать - берите готовый код. например от Одиночки. Считаете, что он вам не подходит и вы можете лучше - так разбирайтесь и правьте сами! А сейчас получается - "я хочу сделать часы, готовый код меня не устраивает, у меня такого-то датчика нет... программирование не знаю и учиться не хочу... " ... и начинаем задавать бесконечные тупые вопросы в ветке и "выдавать на гора" все более и более кривые версии кода, засоряя ветку и создавая проблемы для тех, кто потом захочет это повторить.
Если кому нужны часы с "блек-джеком и девочками", с десятком термометров, десятью датами и прочая и прочая... закажите b612 готовую прошивку - он по таким извращениям мастер.
b707, я удивляюсь вашему терпению, 200 последних постов просто ни о чём, повторю что нормальный рабочий
код который бес проблем переделывается под все хотелки лежит в посту #113, хотя вы сказали что это не ваш код.
b612 открой тему в готовых проэктах и выкладывай там свои скетчи на тысячи строк, как написал b707 с"блек-джеком и девочками", с десятком термометров и т.д. которые не кому не пригодятся, только поиграться.
Ребят всю ночь считал секунды. У меня точки вспыхивают через const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов
не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так
основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда
таким же образом формируем флажки для каждых 30мс для обзона кнопок
так же формируем флажки для полусекунд и секунд
И дальше с готовыми флажками и считанным временем уже решаем
какие процедурки вызывать
в конце цикла все флажки надо сбросить
Можно для этих целей воспользовать библу "Timer master"
она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime
Вот за это всё спасибо, буду теперь переваривать всё это.
Заколебало, хоть пример откомпелированный привёл одна теория флашками махал махал целый день. Всё назад вернул не получается.
Я специально надёргал из своего кода только те строчки которые вам нужны для понимания теории
если я выложу весь код, вас стошнит от его объёма инепонятности )
Основная идея в том, что
1. по сути вы всегда строите многозадачную систему и нужно делать так, чтобы задачи были максимально независимыми друг от друга
2. алгоритм должен быть ориентирован на объекты, и события, связанные с объектами
3. Поскольку каждая задача самостоятельна, то главный цикл должен крутиться максимально быстро, чтобы каждая задача как можно меньше времени ждала своей очереди.
4. соответственно процедуры, вызываемые из главного цикла должны выполняться без задержек
5. действия в пределах одного прохода не должны повторяться,
6. на главный цикл ещё накладываются некоторые типа административные обязанности, типа отдавать управление каждой задаче не просто по очереди, а по определённому стечению обстоятельств (времени, событий каких-нибудь флажков).
На редкость @банутый авнакод. Так можно и 10 тыс. строк набубенить. Лехко, прям.
Пачистют, канеш, но знай. :-)
На редкость @банутый авнакод. Так можно и 10 тыс. строк набубенить. Лехко, прям.
Пачистют, канеш, но знай. :-)
ага, строки 109, 114 и 122 дают ошибку переполнения.
А вот зачем он устраивает эту свистопляску указателей на отдельные байти миллис - я вообще не въехал. Ты что-нить понял?
что видно уже есйчас - если он будет "помогать" Gen.Aleks - последнему, имхо, проще сразу удавится :)
последнему, имхо, проще сразу удавится :)
Обоим. Один писать не умеет, второй очень похож на хорошо знакомого нам пенсионэра.
Обоим. Один писать не умеет, второй очень похож на хорошо знакомого нам пенсионэра.
ага, нашли друг друга....
Ок. Напишите конкретно, где мои ошибки ?
Я про это с самого начала прошу.
Как написать такой функционал более коротко ?
На счет указателей это для скорости. Если вы будете каждый раз работать с 4-ёхбайтным числом, это займёт кучу машинных тактов.
Переполнение и хрен бы с ним.
На счет указателей это для скорости. Если вы будете каждый раз работать с 4-ёхбайтным числом, это займёт кучу машинных тактов.
в часах?
опять же - в часах? серьезно? :)
Да в часах.
Ибо проц занимается анимацией и синтезом звука
вот по этим строчкам два вопроса:
1. Зачем нужны эти переменные вообще?
2. А если нужны - зачем они глобальные?
а вообще стоп. Вторично вы меня в эту тягомотину не втянете. Пусть удалят - но идите-ка вы в жопу со своим кодом.
а вообще стоп. Вторично вы меня в эту тягомотину не втянете. Пусть удалят - но идите-ка вы в жопу со своим кодом.
Вот как-то, матьтваю, категорически поддерживаю. :-)
2. А если нужны - зачем они глобальные?
Вот по этому они есть и глобальные.
и учиться учиться и учиться у старичков практическому пердению ))
вызывает только вашу когнитивную ошибку.
код отрабатывается корректно
if (uint8_t(*ptrMillis8 - oldMillis32) >= 32) {
oldMillis32 = oldMillis32 + 32;
к примеру uint8_t(255 - 254) даст 1, это будет < 32
uint8_t(000 - 254) даст, как ни странно, 2, это будет по прежнему < 32
uint8_t(030 - 254) даст 32, это будет >= 32 , условие сработает и
к 254 сразу прибавится 32 и получится 030
и далее
uint8_t(031 - 030) опять даст 1, это будет по прежнему < 30
ЗЫ: не пердежу, не попёрдыванию, а именно пердению )
b612 мы с вами наверно ближе по возрасту мне 50 дочь замужем, сын в армию пойдёт, у вас тоже дети, я бы хотел не в рамках форума пообщаться, чтобы не засарять эфир как говорится. Часы чёрт с ними если у всех нормально идут наверно китайцы ардуино нано с кварцем другим подсунули я слышал на форумах бывает такое, а конкретно встретил вас на форуме где вы делали драйвер из ардуинки для компьютерной программы осцилографа, я работаю на заводе и мне для ремонта приводов требуется по возможности маленький осцилограф и не важно большую частоту чтоб он ловил буквально от 0 до 100 Гц но чтоб чётко ловил меандр и постоянное напряжение, до кучи в этот прибор хочу воткнуть и частотомер, задатчик скорости для длигателей постоянного тока. генератор частоты тоже всё без фанатизма. простенький, ну если уж получится определитель короткозамкнутых витков в моторах. А то приходится ремонтировать не отходя от станка и пока принесёшь все приборы полдня пройдёт а так положил в карман и готово. Так как ноубук нам ещё не купили заинтересовала меня тема с жидкокресталическими дисплеями от сотового телефона и ардуино нано, у меня есть дисплей от не работающего телефона Alcatel BF4 весь итернет перерыл не могу найти ни схему телефона ни цокалёвку дисплея, фирма французская. Вот фото дисплея, может кто даст наводку как определить цоколёвку:
Хотя мне уже поднадоели эти мелкие глупые проекты.
Выжимать из АЦП ардуины несчастные килосэмплы после того как научился синтезировать на ней нормальный звук..
Уже давненько мечтаю оседлать нейросети.
Что касается экранчика, на али 200р совершенно понятные экранчики на любой вкус. Чем париться искать даташит да потом программировать этот единственный экранчик а потом случайно его сжечь
мне 48
что ж вы оба такие старички по духу? :) я старше вас обоих :))) А по настроению - млпдше лет на 20 :)
ай! да! дедушка ! мне бы такого
Дедушек любят не за крутизну, а за дружелюбие, смирение и доброту и уж потом за всякие прикольные фишечки и штучки
Что то уже самому расхотелось. Точно лучше купить.Вот b612 это был ты))).
Или дайте исходники, если не жалко.
Исходники DelphiXE6
Правда я уже заканчиваю свою прогу.
это вот как раз про кардиограф было или может даже ещё про фолль
как давно это было !
Сейчас есть в планах сделать на таком ЖК-шнике свой "сталкер" (фонарь-таймер-градусник-сторож)
Прототип уже во всю трудится в районе кухни, но он здоровенный и тяжелый и светики слабенькие.
Уже приехал и ЖК-шник и светик CreeXM и мощный светик с глубоким УФ, дело за моделью корпуса.
Добрый день! Люди может кто подскажет собрал часы на ds1307 все работало, выключил питание включил теперь показывают 8954 и всё, весь день ковыряюсь. может модуль накрылся?
Прошейте любую тестовую прошивку с выводом на комп.
Модуль ведь подключается стандартно
выдаёт ошибку в мониторинге.