Склероз ардуино.

Romello
Offline
Зарегистрирован: 06.11.2019

Здравствуйте, товарищи! Возникла проблема, стал сбрасываться скетч на китайской уно. после отключения питания платы. То есть, при повторном включении загорается только "on" на плате и on" на rtc. Как решить данную проблему?

Ниже скетч. Немного мной измененный.

001#include <DS3231.h>
002#include <Wire.h>
004 
005    // 7сигментный индикатор
006#define CLK 6        
007#define DIO 7
008#define MAX_BRIGHT 7      // яркость дисплея дневная (0 - 7)
009#define MIN_BRIGHT 1      // яркость дисплея ночная (0 - 7)
010#define  NIGHT_START 23    // час перехода на ночную подсветку (MIN_BRIGHT)
011#define NIGHT_END 10   // яркость, от 0 до 7
012    // кнопки
013#define keyHor 5
014#define keyMin 4
015#define keyPL  3
016 
017TM1637 tm1637(CLK,DIO); 
018#define DS3231_I2C_ADDRESS 0x68
019   
020volatile boolean flag;
021 
022///// часы ..
023byte decToBcd(byte val){
024  return ( (val/10*16) + (val%10) );
025}
026 
027byte bcdToDec(byte val){
028  return ( (val/16*10) + (val%16) );
029}
030 
031void setDateDs3231(byte second,        // 0-59
032                   byte minute,        // 0-59
033                   byte hour,          // 1-23
034                   byte dayOfWeek,     // 1-7
035                   byte dayOfMonth,    // 1-28/29/30/31
036                   byte month,         // 1-12
037                   byte year)          // 0-99
038{
039   Wire.beginTransmission(DS3231_I2C_ADDRESS);
040   Wire.write(0);
041   Wire.write(decToBcd(second));   
042   Wire.write(decToBcd(minute));
043   Wire.write(decToBcd(hour));    
044   Wire.write(decToBcd(dayOfWeek));
045   Wire.write(decToBcd(dayOfMonth));
046   Wire.write(decToBcd(month));
047   Wire.write(decToBcd(year));
048   Wire.endTransmission();
049}
050 
051void getDateDs3231(byte *second,
052          byte *minute,
053          byte *hour,
054          byte *dayOfWeek,
055          byte *dayOfMonth,
056          byte *month,
057          byte *year)
058{
059 
060  Wire.beginTransmission(DS3231_I2C_ADDRESS);
061  Wire.write(0);
062  Wire.endTransmission();
063 
064  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
065 
066  *second     = bcdToDec(Wire.read() & 0x7f);
067  *minute     = bcdToDec(Wire.read());
068  *hour       = bcdToDec(Wire.read() & 0x3f);
069  *dayOfWeek  = bcdToDec(Wire.read());
070  *dayOfMonth = bcdToDec(Wire.read());
071  *month      = bcdToDec(Wire.read());
072  *year       = bcdToDec(Wire.read());
073}
074 
075//void setINT(){    //включает выход SQW, который вроде выключен по умолчанию
076//  Wire.beginTransmission(DS3231_I2C_ADDRESS);
077//  Wire.write(0x0E);
078//  Wire.write(0x0);
079//  Wire.endTransmission();
080//}
081//
082//void blink() {
083//  digitalWrite(13, !digitalRead(13));
084//  flag = !flag;
085//  tm1637.point(flag);
086//}
087 
088void loop(){
089    // читаем время из модуля
090  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
091  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
092    // забиваем массив значениями для отпарвки на экран
093  int8_t TimeDisp[4];
094   
095  TimeDisp[0] = hour / 10;
096  TimeDisp[1] = hour % 10;
097  TimeDisp[2] = minute / 10;
098  TimeDisp[3] = minute % 10;
099 
100   if ( (hour >= NIGHT_START && hour <= 23)
101           || (hour >= 0 && hour <= NIGHT_END) ) tm1637.set(MIN_BRIGHT);
102      else tm1637.set(MAX_BRIGHT);
103 if (hour == NIGHT_START) tm1637.set(MIN_BRIGHT);
104        if (hour == NIGHT_END) tm1637.set(MAX_BRIGHT);
105 
106    // обработка кнопок
107  if (!digitalRead(keyHor)){   // часы
108      second = 0;                           // сбрасываем секунды
109      hour++;                               // пребавляем единицу к часам
110      if (hour > 23) hour = 0;              // если вылезли за границы присваеваем 0
111      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
112      delay(200);
113  }
114  if (!digitalRead(keyMin)){   // минуты
115      second = 0;
116      minute++;
117      if (minute > 59) minute = 0;
118      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
119      delay(200);
120  }
121     // отправляем массив на экран
122 tm1637.display(TimeDisp);
123  
124 
125}
126 
127void setINT(){    //включает выход SQW, который вроде выключен по умолчанию
128  Wire.beginTransmission(DS3231_I2C_ADDRESS);
129  Wire.write(0x0E);
130  Wire.write(0x0);
131  Wire.endTransmission();
132}
133 
134void blink() {
135  digitalWrite(13, !digitalRead(13));
136  flag = !flag;
137  tm1637.point(flag);
138}
139 
140void setup() {
141//  Serial.begin(9600);
142  Wire.begin();
143  pinMode(13, OUTPUT);
144  pinMode(keyHor, INPUT_PULLUP);
145  pinMode(keyMin, INPUT_PULLUP);
146  pinMode(keyPL, INPUT_PULLUP);
147 
148  tm1637.init();
149    
150   
151  setINT();
152  attachInterrupt(0, blink, CHANGE);
153 
154}
155 
156 
157//void loop(){
158//    // читаем время из модуля
159//  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
160//  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
161//    // забиваем массив значениями для отпарвки на экран
162//  int8_t TimeDisp[4];
163// 
164//  TimeDisp[0] = hour / 10;
165//  TimeDisp[1] = hour % 10;
166//  TimeDisp[2] = minute / 10;
167//  TimeDisp[3] = minute % 10;
168//
169//    // обработка кнопок
170//  if (!digitalRead(keyHor)){   // часы
171//      second = 0;                           // сбрасываем секунды
172//      hour++;                               // пребавляем единицу к часам
173//      if (hour > 23) hour = 0;              // если вылезли за границы присваеваем 0
174//      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
175//      delay(200);
176//  }
177//  if (!digitalRead(keyMin)){   // минуты
178//      second = 0;
179//      minute++;
180//      if (minute > 59) minute = 0;
181//      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
182//      delay(200);
183//  }
184//     // отправляем массив на экран
185//  tm1637.display(TimeDisp);
186//
187//
188//}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Взять ардуину без склероза.

Romello
Offline
Зарегистрирован: 06.11.2019

Хм, а это мысль. А какого производителя лучше, если выбирать из китайских? Сейчас у меня wavgat.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я склонен доверять RobotDyn. WAVGAT - это подстава. Вверху строка поиска, вбейте туда слово "WAVGAT".

Может ещё из https://www.diymore.cc/collections/dm-strong-series что-нить присмотреть, наверное. По виду так ничегошные.

 

b707
Offline
Зарегистрирован: 26.05.2017

Romello пишет:

А какого производителя лучше, если выбирать из китайских? Сейчас у меня wavgat.

это вы как в лотерею выиграли, только с обратным знаком. Ардуину можно брать практически любую, лишь бы не Вавгат :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Romello пишет:

Сейчас у меня wavgat.

Так надо было с этого и начинать! А то скрывали зачем-то, в первом посте писали

Romello пишет:

на китайской уно. 

Нихарашо!

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b707 пишет:

Romello пишет:

А какого производителя лучше, если выбирать из китайских? Сейчас у меня wavgat.

это вы как в лотерею выиграли, только с обратным знаком. Ардуину можно брать практически любую, лишь бы не Вавгат :)

 

Ну не знаю, пользуючь Вавгатовскими модулями(не только ардуинами) регулярно. На мой взгляд качество выше среднего.

Конечно не стоит брать (если специально не требуется) их модули на "совместимых" чипах, но о том что это не оригинальные чипы в описании честно, хотя и не очень внятно написаною

Вот у них обычная нана - https://ru.aliexpress.com/item/32531372300.html

А вот совместимая - https://ru.aliexpress.com/item/32868170637.html  Эту лучше не брать. Хоть по некоторым параметрам она и лучше обычной, но потребубтся дополнительные пляски с бубном.