Склероз ардуино.
- Войдите на сайт для отправки комментариев
Ср, 06/11/2019 - 12:32
Здравствуйте, товарищи! Возникла проблема, стал сбрасываться скетч на китайской уно. после отключения питания платы. То есть, при повторном включении загорается только "on" на плате и on" на rtc. Как решить данную проблему?
Ниже скетч. Немного мной измененный.
001 | #include <DS3231.h> |
002 | #include <Wire.h> |
003 | #include "TM1637.h" // <a href="http://www.seeedstudio.com/wiki/File:DigitalTube.zip" title="http://www.seeedstudio.com/wiki/File:DigitalTube.zip" rel="nofollow">http://www.seeedstudio.com/wiki/File:DigitalTube.zip</a> |
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 |
017 | TM1637 tm1637(CLK,DIO); |
018 | #define DS3231_I2C_ADDRESS 0x68 |
019 | |
020 | volatile boolean flag; |
021 |
022 | ///// часы .. |
023 | byte decToBcd( byte val){ |
024 | return ( (val/10*16) + (val%10) ); |
025 | } |
026 |
027 | byte bcdToDec( byte val){ |
028 | return ( (val/16*10) + (val%16) ); |
029 | } |
030 |
031 | void 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 |
051 | void 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 |
088 | void 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 |
127 | void setINT(){ //включает выход SQW, который вроде выключен по умолчанию |
128 | Wire.beginTransmission(DS3231_I2C_ADDRESS); |
129 | Wire.write(0x0E); |
130 | Wire.write(0x0); |
131 | Wire.endTransmission(); |
132 | } |
133 |
134 | void blink() { |
135 | digitalWrite(13, !digitalRead(13)); |
136 | flag = !flag; |
137 | tm1637.point(flag); |
138 | } |
139 |
140 | void 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 | //} |
Взять ардуину без склероза.
Хм, а это мысль. А какого производителя лучше, если выбирать из китайских? Сейчас у меня wavgat.
Я склонен доверять RobotDyn. WAVGAT - это подстава. Вверху строка поиска, вбейте туда слово "WAVGAT".
Может ещё из https://www.diymore.cc/collections/dm-strong-series что-нить присмотреть, наверное. По виду так ничегошные.
А какого производителя лучше, если выбирать из китайских? Сейчас у меня wavgat.
это вы как в лотерею выиграли, только с обратным знаком. Ардуину можно брать практически любую, лишь бы не Вавгат :)
Сейчас у меня wavgat.
Так надо было с этого и начинать! А то скрывали зачем-то, в первом посте писали
на китайской уно.
Нихарашо!
А какого производителя лучше, если выбирать из китайских? Сейчас у меня wavgat.
это вы как в лотерею выиграли, только с обратным знаком. Ардуину можно брать практически любую, лишь бы не Вавгат :)
Ну не знаю, пользуючь Вавгатовскими модулями(не только ардуинами) регулярно. На мой взгляд качество выше среднего.
Конечно не стоит брать (если специально не требуется) их модули на "совместимых" чипах, но о том что это не оригинальные чипы в описании честно, хотя и не очень внятно написаною
Вот у них обычная нана - https://ru.aliexpress.com/item/32531372300.html
А вот совместимая - https://ru.aliexpress.com/item/32868170637.html Эту лучше не брать. Хоть по некоторым параметрам она и лучше обычной, но потребубтся дополнительные пляски с бубном.