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

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

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

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

#include <DS3231.h>
#include <Wire.h>
#include "TM1637.h"  // http://www.seeedstudio.com/wiki/File:DigitalTube.zip

    // 7сигментный индикатор
#define CLK 6         
#define DIO 7 
#define MAX_BRIGHT 7      // яркость дисплея дневная (0 - 7)
#define MIN_BRIGHT 1      // яркость дисплея ночная (0 - 7)
#define  NIGHT_START 23    // час перехода на ночную подсветку (MIN_BRIGHT)
#define NIGHT_END 10   // яркость, от 0 до 7
    // кнопки
#define keyHor 5
#define keyMin 4 
#define keyPL  3

TM1637 tm1637(CLK,DIO);  
#define DS3231_I2C_ADDRESS 0x68
  
volatile boolean flag;

///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

void setDateDs3231(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS3231_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs3231(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}

//void setINT(){    //включает выход SQW, который вроде выключен по умолчанию
//  Wire.beginTransmission(DS3231_I2C_ADDRESS);
//  Wire.write(0x0E);
//  Wire.write(0x0);
//  Wire.endTransmission();
//}
//
//void blink() {
//  digitalWrite(13, !digitalRead(13));
//  flag = !flag;
//  tm1637.point(flag); 
//}

void loop(){
    // читаем время из модуля
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
    // забиваем массив значениями для отпарвки на экран
  int8_t TimeDisp[4]; 
  
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;

   if ( (hour >= NIGHT_START && hour <= 23)
           || (hour >= 0 && hour <= NIGHT_END) ) tm1637.set(MIN_BRIGHT);
      else tm1637.set(MAX_BRIGHT);
 if (hour == NIGHT_START) tm1637.set(MIN_BRIGHT);
        if (hour == NIGHT_END) tm1637.set(MAX_BRIGHT);

    // обработка кнопок
  if (!digitalRead(keyHor)){   // часы
      second = 0;                           // сбрасываем секунды
      hour++;                               // пребавляем единицу к часам
      if (hour > 23) hour = 0;              // если вылезли за границы присваеваем 0
      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
      delay(200);
  }
  if (!digitalRead(keyMin)){   // минуты
      second = 0;
      minute++;
      if (minute > 59) minute = 0;
      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
      delay(200);
  }
     // отправляем массив на экран
 tm1637.display(TimeDisp);
 

}

void setINT(){    //включает выход SQW, который вроде выключен по умолчанию
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x0E);
  Wire.write(0x0);
  Wire.endTransmission();
}

void blink() {
  digitalWrite(13, !digitalRead(13));
  flag = !flag;
  tm1637.point(flag); 
}

void setup() {
//  Serial.begin(9600);
  Wire.begin();
  pinMode(13, OUTPUT);
  pinMode(keyHor, INPUT_PULLUP);
  pinMode(keyMin, INPUT_PULLUP);
  pinMode(keyPL, INPUT_PULLUP);

  tm1637.init();
   
  
  setINT(); 
  attachInterrupt(0, blink, CHANGE);

}


//void loop(){
//    // читаем время из модуля
//  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
//  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
//    // забиваем массив значениями для отпарвки на экран
//  int8_t TimeDisp[4]; 
//  
//  TimeDisp[0] = hour / 10;
//  TimeDisp[1] = hour % 10;
//  TimeDisp[2] = minute / 10;
//  TimeDisp[3] = minute % 10;
//
//    // обработка кнопок
//  if (!digitalRead(keyHor)){   // часы
//      second = 0;                           // сбрасываем секунды
//      hour++;                               // пребавляем единицу к часам
//      if (hour > 23) hour = 0;              // если вылезли за границы присваеваем 0
//      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
//      delay(200);
//  }
//  if (!digitalRead(keyMin)){   // минуты
//      second = 0;
//      minute++;
//      if (minute > 59) minute = 0;
//      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
//      delay(200);
//  }
//     // отправляем массив на экран
//  tm1637.display(TimeDisp);
// 
//
//}

 

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  Эту лучше не брать. Хоть по некоторым параметрам она и лучше обычной, но потребубтся дополнительные пляски с бубном.