Робочайник200

anton_1992
Offline
Зарегистрирован: 14.11.2015

Всем привет! Пошел я когда-то в армию погулять и мои в мое отсутствие сожгли керамический чайник с электронным управлением. По возвращения с армии было установлено, что сгорела какая-то подлая деталька в схеме управления и естественно меня заставили ее чинить. А так как я плохо разбираюсь в поиске подлых сгоревших деталек, то просто выкинул всю плату и решил создать что-то свое. Тут на злаза как раз попалась тема про Ардуино, ну и понеслось...)

Не думаю что я сделал что-то оригинальное, поэтому обойдусь минимальным описание и видео из которого более менее понятно как сам чайник сшит. Вот собственно видео: https://youtu.be/5lYGfQUlpm0 (заранее извиняюсь за ссылку, у Вас за них вообще банят?).

А вот и краткое описание: чайник умеет показывать температуру воды, умеет копятить ее до заданного уровня и поддерживать в течении длительного времени, умеет оповещать всех окружающих о том что он закипел и о том что ему не нравиться в дествиях человека в отношении его. Воду охлаждать не умеет и поэтому обижается, когда ставишь температуру ниже текущей в чайнике. Вся озвучка записана через синтезатор речи и проигрывается в псевдослучайном порядке при определенных условиях. На борту также имеются часы реального времени, так что свои вопли он прекращает где-то в районе 10-11 вечера и молчит до 9 утра)

Код программы я выложу только если попросите... там несовсем чисто... очень много мусора, ненужных переменных, нужда в которых отпала в процессе длительного создания кода, много закоменченых нерабочих участков и прочей ерунды. 

Внимание! Это мой первый проект, так что критикуйте так чтобы у меня навсегда отпало желание сотворять подобные бесполезные вещи)

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

прикольно получилось.

теперь критика: критикую, только не понятно что критиковать - ни кода, ни схемы.

cudla1973
Offline
Зарегистрирован: 21.02.2013

Мне интересно как сделана часть которая измеряет температуру схему бы?

anton_1992
Offline
Зарегистрирован: 14.11.2015

ну Вы напросились...!) Это мой второй проект после мигания светодиодом на 13 порту и если у вас потечет кровь их глаз, то пеняйте на себя!) 

#include <SPI.h>

//Add the SdFat Libraries
#include <SdFat.h>
#include <SdFatUtil.h>

//and the MP3 Shield Library
#include <SFEMP3Shield.h>

// Below is not needed if interrupt driven. Safe to remove if not using.
#if defined(USE_MP3_REFILL_MEANS) && USE_MP3_REFILL_MEANS == USE_MP3_Timer1
  #include <TimerOne.h>
#elif defined(USE_MP3_REFILL_MEANS) && USE_MP3_REFILL_MEANS == USE_MP3_SimpleTimer
  #include <SimpleTimer.h>
#endif


SdFat sd;


SFEMP3Shield MP3player;


#include <math.h>
#include <util/delay.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>
#if defined(USE_MP3_REFILL_MEANS) && USE_MP3_REFILL_MEANS == USE_MP3_Timer1
  #include <TimerOne.h>
#elif defined(USE_MP3_REFILL_MEANS) && USE_MP3_REFILL_MEANS == USE_MP3_SimpleTimer
  #include <SimpleTimer.h>
#endif




const int buttonPin = 14;   
const int buttonPin2 = 16; // номера портов к которым подключен регулятор
const int button = 15; // нормер порта кнопки
const int pirPin = 1; // номер порта датчика движения
int buttonState = 0;    
int t; // переменная для хранения текущего состояние счетчика
int x = 0; // переменная для хранения предыдущего состояния счетчика
int c; //сотня
int d; //десятки
int e; //единицы
int r1; // оперделяет режим работы
  int cl;
 char* nameTrec; // имя трека
int IDTrec; // идентификатор текущих треков
int IDTrec1=0; // идентификатор предыдущих треков
int nomberCondition; // номер состояния
int nomberCondition2=0; // номер состояния кипячения
int regimtrec=0; // режим трека
int nomberRegim=0; // счетчик для режимов
int counter = 100;  //счетчик
int counter2 = 0; // счетчик для выбора режима
const byte latchPin = 3;
const byte clockPin = 5;
const byte dataPin = 4;
unsigned char* buf; // буфер
int TEM=0; // идентификатор поддержания температуры
int analogPin3 = 17;  //порт входа термистора

//int analogPin6 = 19; //порт пит-ания термистера
const int rele = 10; // пин подключения реле
unsigned int bitsnumbersC[] = {0b0000001000000010, 0b0000111011000010, 0b0000001001000100, 
                               0b0000101001000000, 0b0000111010000000, 0b0000101000001000, 
                               0b0000001000001000, 0b0000111001000010, 0b0000001000000000,
                               0b0000101000000000, 0b0000000000000000};   //биты для чисел для сотни 

unsigned int bitsnumbersD[] = {0b0000000000100010, 0b0000110011100010, 0b0000000001100100, 
                               0b0000100001100000, 0b0000110010100000, 0b0000100000101000, 
                               0b0000000000101000, 0b0000110001100010, 0b0000000000100000,
                               0b0000100000100000, 0b0000000000000000};   //биты для чисел для десятков  
                               
unsigned int bitsnumbersE[] = {0b0000000000010010, 0b0000110011010010, 0b0000000001010100, 
                               0b0000100001010000, 0b0000110010010000, 0b0000100000011000, 
                               0b0000000000011000, 0b0000110001010010, 0b0000000000010000,
                               0b0000100000010000, 0b0000000000000000};   //биты для чисел для единиц
                                                             
                              
unsigned int bitsnumbers[] = {0b0000001000110010, 0b0000111111110010, 0b0000001001110100, 
                             0b0000101001110000, 0b0000111010110000, 0b0000101000111000, 
                             0b0000001000111000, 0b0000111001110010, 0b0000001000110000,
                             0b0000101000110000};   //биты для чисел

unsigned int bitsLed[] = {0b0111000100000000, 0b0011000100000000, 0b0011000100000000,
                          0b0011000100000000, 0b0011000100000000, 0b0011000100000000, 0b0011000100000000,
                          0b0011000100000000, 0b0011000100000000, 0b0011000100000000, 0b0011000100000000,
                          0b0011000100000000, 0b0011000100000000, 0b0011000100000000, 0b0011000100000000,
                          0b0011000100000000, 0b0011000100000000, 0b0011000100000000, 0b0011000100000000,
                          0b0011000100000000, 0b0011000100000000, 0b0011000100000000, 0b0011000100000000,
                          0b0101000100000000, 0b0101000100000000, 0b0101000100000000, 0b0101000100000000,
                          0b0101000100000000, 0b0101000100000000, 0b0101000100000000, 0b0101000100000000,
                          0b0101000100000000, 0b0101000100000000, 0b0101000100000000, 0b0101000100000000,
                          0b0101000100000000, 0b0101000100000000, 0b0101000100000000, 0b0101000100000000,
                          0b0101000100000000, 0b0101000100000000, 0b0101000100000000, 0b0101000100000000,
                          0b0101000100000000, 0b0101000100000000, 0b0101000100000000, 0b0101000100000000,
                          0b0101000100000000, 0b0101000100000000, 0b0110000100000000, 0b0110000100000000,
                          0b0110000100000000, 0b0110000100000000, 0b0110000100000000, 0b0110000100000000,
                          0b0110000100000000, 0b0110000100000000, 0b0110000100000000, 0b0110000100000000,
                          0b0110000100000000, 0b0110000100000000, 0b0110000100000000, 0b0110000100000000,
                          0b0110000100000000, 0b0110000100000000, 0b0110000100000000, 0b0110000100000000,
                          0b0110000100000000, 0b0110000100000000, 0b0110000100000000, 0b0110000100000000,
                          0b0110000100000000, 0b0110000100000000, 0b0110000100000000, 0b0110000100000000,} ;    //биты для светодиодов      
                           
unsigned int bitsLed2[] = {0b0000000100000000, 0b0000000100000000, 0b0000000100000000, 0b0000000100000000, 
                           0b0000000100000000, 0b0000000100000000, 0b0000000100000000, 0b0000000100000000, 
                           0b0000000100000000, 0b0000000100000000, 0b0000000100000000, 0b0000000100000000, 
                           0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 
                           0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 
                           0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, } ;    //биты для светодиодов   для моргания              

unsigned int bitsLed3[] = {0b0111000100000000, 0b0011000100000000, 0b0101000100000000, 0b0110000100000000,};



 
 
double rt;
double temp;
const int chipSelect = 4;
long previousMillis = 0; // время последнего движения
long interval = 1000; // интервал в 1

long previousMillisPlay = 0; // время последнего проигрывания
long previousMillisRegim = 0; // время ввода режима
long intervalPlay = 10000; // интервал в 10 сек между проигрываниями
long intervalRegim = 3000; // интервал ожидания ввода режима







void led(int numberLed) //функция вывода на экран значений
     {
    
    // Serial.println(numberLed);
     c=numberLed/100; 
     d=numberLed/10; 
     e=numberLed-d*10;
     if (d==10){
     d=0;}

     byte regOneC = highByte(bitsnumbersC[c]);
     byte regTwoC = lowByte(bitsnumbersC[c]);
     digitalWrite(latchPin, LOW);  
     shiftOut(dataPin, clockPin, MSBFIRST,regOneC); 
     shiftOut(dataPin, clockPin, MSBFIRST,regTwoC);
     digitalWrite(latchPin, HIGH); 
     //delay(5);
    
     byte regOneD = highByte(bitsnumbersD[d]);
     byte regTwoD = lowByte(bitsnumbersD[d]);
     digitalWrite(latchPin, LOW);  
     shiftOut(dataPin, clockPin, MSBFIRST,regOneD); 
     shiftOut(dataPin, clockPin, MSBFIRST,regTwoD);
     digitalWrite(latchPin, HIGH); 
     //delay(5);

     byte regOneE = highByte(bitsnumbersE[e]);
     byte regTwoE = lowByte(bitsnumbersE[e]);
     digitalWrite(latchPin, LOW);  
     shiftOut(dataPin, clockPin, MSBFIRST,regOneE); 
     shiftOut(dataPin, clockPin, MSBFIRST,regTwoE);
     digitalWrite(latchPin, HIGH); 
    // delay(5);

     
     }
    
     
int thermistor() //функция снятия показания термистора
     {
    // analogWrite(19,1024);
     rt=analogRead(17);
     rt=((10240000/rt)-9910);
     temp=log(rt);
     temp=1/(-0.001029+0.0005056*temp+(-0.0000008947)*temp*temp*temp);
     temp=temp-273.15;
     return temp;
     }


int regulator() // функция снятия показаний с регулятора
    {
    if (counter>=100){
    counter=100;}
    else {
    counter=counter;
    }
    if (counter<=0){
    counter=0;}
    else {
    counter=counter;  //тут мы устанавливаем пределы для нашей величины задаваемой температуры
    }
    t=digitalRead(14);
    if (t==x){
    counter=counter;}
    else{
    x=t;
    counter=counter+1;
    }
    t=digitalRead(16);
    if (t==x){
    counter=counter;}
    else{
    x=t;
    counter=counter-1; // тут мы проверяем в какую сторону поворачивают регулятор и меняем значение соответствующим образом 
    }
    return counter;
    }


int regulatorRegim() // функция снятия показаний с регулятора для определения режима работы
    {

    int r; 
   
    if (counter2>3){
    counter2=0;}
    else {
    counter2=counter2;
    }
    if (counter2<0){
    counter2=3;}
    else {
    counter2=counter2;  //тут мы устанавливаем пределы для нашей величины задаваемой температуры
    }
    t=digitalRead(14);
    if (t==x){
    counter2=counter2;}
    else{
    x=t;
    counter2=counter2+1;
    }
    t=digitalRead(16);
    if (t==x){
    counter2=counter2;}
    else{
    x=t;
    counter2=counter2-1; // тут мы проверяем в какую сторону поворачивают регулятор и меняем значение соответствующим образом 
    }
    if (counter2>=0 && counter2<=1) { // если оба значения верны
      r=0; // спящий режим
    }
    if (counter2>1 && counter2<=2) {
      r=1; // режим кипячения
    }
    if (counter2>2 && counter2<=3) {
      r=2; // режим подогрева
    }
    if (counter2>3 && counter2<=4) {
      r=3; // режим диско
    }
  
   
    led3(counter2);
    return r;
    }

void led3(int q43){
     byte regOneL3 = highByte(bitsLed3[q43]);
     byte regTwoL3 = lowByte(bitsLed3[q43]);
     digitalWrite(latchPin, LOW);  
     shiftOut(dataPin, clockPin, MSBFIRST,regOneL3); 
     shiftOut(dataPin, clockPin, MSBFIRST,regTwoL3);
     digitalWrite(latchPin, HIGH);
  
}
    

void relay(int temp, int counter) // функция реле 
    {  
   
    if (nomberCondition2==0){  // исходный режим
             if (temp>counter){
               
                 IDTrec=1;
                if(IDTrec1!=IDTrec){nameTrec=RandomTrec(420,430); parse_menu('p', nameTrec ); IDTrec1=IDTrec;}// "не умею охлаждать" 
                 
              
              } 
             if (temp<=counter && temp!=0){
              nomberCondition2=1;
              }
             if (temp==0){
              nomberCondition2=0;
              }
      
    }
    
    if (nomberCondition2==1){ // режим кипячения
      
       digitalWrite(rele, LOW); //  включаем реле и кипятим
       for (int i=0; i<=75; i++){
       byte regOneL = highByte(bitsLed[i]);
       byte regTwoL = lowByte(bitsLed[i]);
       digitalWrite(latchPin, LOW);  
       shiftOut(dataPin, clockPin, MSBFIRST,regOneL); 
       shiftOut(dataPin, clockPin, MSBFIRST,regTwoL);
       digitalWrite(latchPin, HIGH); 
       // и включаем светодиод на пенели
       led(temp); // и показываем текущую тепмературу
   
      }      
             
             
             if (temp==0){ // если чайник сняли
             digitalWrite(rele, HIGH); //  выключаем реле
             
             IDTrec=2;
             if(IDTrec1!=IDTrec){nameTrec=RandomTrec(440,449); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // возмущаемся по поводу исчезновения чайника
             digitalWrite(latchPin, LOW);  
             shiftOut(dataPin, clockPin, MSBFIRST,0b000000000000000000); 
             shiftOut(dataPin, clockPin, MSBFIRST,0b000000000000000000);
             digitalWrite(latchPin, HIGH); ;
             }
             if(temp!=0 && temp<counter){ //если чайник не снимали и темп воды ниже счетчика
             digitalWrite(rele, LOW); //  включаем реле и кипятим
             for (int i=0; i<=75; i++){
             byte regOneL = highByte(bitsLed[i]);
             byte regTwoL = lowByte(bitsLed[i]);
             digitalWrite(latchPin, LOW);  
             shiftOut(dataPin, clockPin, MSBFIRST,regOneL); 
             shiftOut(dataPin, clockPin, MSBFIRST,regTwoL);
             digitalWrite(latchPin, HIGH); 
             // и включаем светодиод на пенели
             led(temp); // и показываем текущую тепмературу
             }
             
             IDTrec=3;
             if(IDTrec1!=IDTrec){nameTrec=RandomTrec(1,10); parse_menu('p', nameTrec ); IDTrec1=IDTrec;}  // оповещаем о включении закипания
             
              
             }
             
             
             if (temp>=counter){ // если температура достигла счетчика
             digitalWrite(rele, HIGH); //  выключаем реле
             nomberCondition2=2;
             for (int i=1; i<=24; i++){
             byte regOneL = highByte(bitsLed2[i]);
             byte regTwoL = lowByte(bitsLed2[i]);
             digitalWrite(latchPin, LOW);  
             shiftOut(dataPin, clockPin, MSBFIRST,regOneL); 
             shiftOut(dataPin, clockPin, MSBFIRST,regTwoL);
             digitalWrite(latchPin, HIGH); // и и моргаем всеми светодиодами
             
             IDTrec=4; 
             if(IDTrec1!=IDTrec){nameTrec=RandomTrec(500,507); parse_menu('p', nameTrec ); IDTrec1=IDTrec;}  // оповещаем о закипании
             led(temp); // и показываем текущую тепмературу
             }
             }
   
             
             
             
   
   }

   if (nomberCondition2==2){ // режим поддержания температуры
    

            if(counter-temp>5){}
            
            if(counter-temp>5){ // если вода остыла более чем на 5 градусов
              digitalWrite(rele, LOW); //  включаем реле и подогреваем
              byte regOneL = highByte(bitsLed[64]);
              byte regTwoL = lowByte(bitsLed[64]);
              digitalWrite(latchPin, LOW);  
              shiftOut(dataPin, clockPin, MSBFIRST,regOneL); 
              shiftOut(dataPin, clockPin, MSBFIRST,regTwoL);
              digitalWrite(latchPin, HIGH); // и включаем один светодиод
              led(counter); // и показываем текущую тепмературу
              
              IDTrec=6; 
              if(IDTrec1!=IDTrec){nameTrec=RandomTrec(400,400); parse_menu('p', nameTrec ); IDTrec1=IDTrec;}  // воспроизводим "ой, температурв упала"
              led(temp);
            }
            else{
              digitalWrite(rele, HIGH); //  иначе выключаем реле
              led(temp); // и показываем текущую тепмературу
              
              IDTrec=7;
              if(IDTrec1!=IDTrec){nameTrec=RandomTrec(409,413); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // оповещаем что все под контролем
              
            }


             
   }

    }      
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    





void setup()
{
 //Serial.begin(9600);
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
 pinMode(rele, OUTPUT); // устанавливаем  пин на выход
 pinMode(buttonPin,  INPUT); // устанавливаем  пин на вход
 pinMode(buttonPin2,  INPUT); // устанавливаем  пин на вход
 pinMode(button, INPUT); //устанавливаем пин на вход
 pinMode(pirPin, INPUT); //устанавливаем пин сенсора движения на вход
 Wire.begin();
 RTC.begin();
 uint8_t result; //result code from some function as to be tested at later time.


 //Serial.print(F("F_CPU = "));
 // Serial.println(F_CPU);
  //Serial.print(F("Free RAM = ")); // available in Version 1.0 F() bases the string to into Flash, to use less SRAM.
  //Serial.print(FreeRam(), DEC);  // FreeRam() is provided by SdFatUtil.h
  //Serial.println(F(" Should be a base line of 1028, on ATmega328 when using INTx"));


  //Initialize the SdCard.
  if(!sd.begin(SD_SEL, SPI_FULL_SPEED)) sd.initErrorHalt();
  // depending upon your SdCard environment, SPI_HAVE_SPEED may work better.
  if(!sd.chdir("/")) sd.errorHalt("sd.chdir");

  //Initialize the MP3 Player Shield
  result = MP3player.begin();
  //check result, see readme for error codes.
  if(result != 0) {
   // Serial.print(F("Error code: "));
   // Serial.print(result);
   // Serial.println(F(" when trying to start MP3 player"));
    if( result == 6 ) {
     // Serial.println(F("Warning: patch file not found, skipping.")); // can be removed for space, if needed.
     // Serial.println(F("Use the \"d\" command to verify SdCard can be read")); // can be removed for space, if needed.
    }
  }

#if defined(__BIOFEEDBACK_MEGA__) // or other reasons, of your choosing.
  // Typically not used by most shields, hence commented out.
  //Serial.println(F("Applying ADMixer patch."));
  if(MP3player.ADMixerLoad("admxster.053") == 0) {
    //Serial.println(F("Setting ADMixer Volume."));
    MP3player.ADMixerVol(-3);
  }
#endif
}

 uint32_t  millis_prv;





void parse_menu(byte key_command, char* Name) {

int IDTrec1;
char* Trec; // название  предыдущего трека
char* NowTrec; // название текущего трека





// Below is only needed if not interrupt driven. Safe to remove if not using.
#if defined(USE_MP3_REFILL_MEANS) \
    && ( (USE_MP3_REFILL_MEANS == USE_MP3_SimpleTimer) \
    ||   (USE_MP3_REFILL_MEANS == USE_MP3_Polled)      )

  MP3player.available();
#endif

 // if(Serial.available()) {
   // parse_menu(Serial.read()); // get command from serial input
  //}



   uint8_t result; // result code from some function as to be tested at later time.

  // Note these buffer may be desired to exist globably.
  // but do take much space if only needed temporarily, hence they are here.
  char title[30]; // buffer to contain the extract the Title from the current filehandles
  char artist[30]; // buffer to contain the extract the artist name from the current filehandles
  char album[30]; // buffer to contain the extract the album name from the current filehandles

  //Serial.print(F("Received command: "));
//  Serial.write(key_command);
 // Serial.println(F(" "));


  

  
        if(key_command == 'p' || key_command == 'p') {
         uint32_t offset = 0;
         if (key_command == 'p') {
               offset = 0;
          }                   
        char* trackName  = Name;
        //Serial.print(trackName);
         #if USE_MULTIPLE_CARDS
         sd.chvol(); 
         #endif
         result = MP3player.playMP3(trackName, offset);
           }


           
  if(key_command == 's') {
         //Serial.println(F("Stopping"));
         MP3player.stopTrack();
                         }                      

}



void disco_Dance(){
int temp2=100;
int IDDIC=0;
counter = regulator();
    
     if (digitalRead(button)==LOW && counter==0 && temp<temp2){ // если кнопка нажата и температура меньше
      unsigned long currentMillis = millis();
      IDDIC=1;
      temp = thermistor(); //снимаем показания термистор
      led(temp);
            if (digitalRead(pirPin)==HIGH){ //и есть движение
            IDTrec=16;
            if(IDTrec1!=IDTrec){parse_menu('s', nameTrec ); nameTrec=RandomTrec(60,63); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // воспроизводим музыку
            digitalWrite(rele, LOW);} 
            if(digitalRead(pirPin)==LOW){ // если нет движения
               if (currentMillis - previousMillis > interval){// прошло больше 3 сек
                previousMillis = currentMillis; // то сохраняем время последнего движения
                digitalWrite(rele, HIGH); //  выключаем реле
                
      led(temp); // и показываем текущую тепмературу} 
              
            IDTrec=17;
            if(IDTrec1!=IDTrec){parse_menu('s', nameTrec ); nameTrec=RandomTrec(50,53); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} //не халявь
            }    
     }
 
}
if(temp>=temp2){
  digitalWrite(rele, HIGH); //  выключаем реле
  }

    
     if (counter==0 && digitalRead(button)==HIGH){ // если кнопка не нажата
          if(IDDIC==1 && temp>=temp2){  // если выключили после режима и вода закипели
            led(counter);
            IDTrec=18;
            if(IDTrec1!=IDTrec){parse_menu('s', nameTrec ); nameTrec=RandomTrec(68,68); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // поздравляем
            }
          if(IDDIC==0){
            IDTrec=19;
            if(IDTrec1!=IDTrec){parse_menu('s', nameTrec ); nameTrec=RandomTrec(70,72); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // оповещаем о включении диско режима
            }

          if(IDDIC==1 && temp<temp2){ // если выключили и не докипятили до конца
            IDTrec=19;
            if(IDTrec1!=IDTrec){parse_menu('s', nameTrec ); nameTrec=RandomTrec(67,67); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // оповещаем о проигрыше
            } 
          } 
                       
     
}     
  
  


 char * RandomTrec(int zz, int xx){ // функция генерации имени файла в заданных пределах
  delete buf; // очищаем буфер 
  char* result;
  int t100;
  t100=random(zz, xx+1);
  String xxx = ".mp3";
  String Name2 = "track";
  String nomber = String(t100);

  String trackName2 = String(Name2 + nomber +  xxx );  //генерируем имя файла


  buf = new unsigned char[100]; // преобразуем стринг в чар
  trackName2.getBytes(buf, 100, 0);

  char *Name = ( char*)buf;
 // delete buf; 
   result=Name;
  //Serial.println(Name);
  
  return result;
 

 }

       
  


 
void loop(){
DateTime now = RTC.now();


union twobyte mp3_vol; // create key_command existing variable that can be both word and double byte of left and right.
    mp3_vol.word = MP3player.getVolume(); // returns a double uint8_t of Left and Right packed into int16_t

if (now.hour() <= 22 && now.hour() >= 9){mp3_vol.byte[1] = 2;} // если текущее время с 9 утра до 22 вечера, то играем в полную силу, иначе молчим
else{mp3_vol.byte[1] = 254;}

 MP3player.setVolume(mp3_vol.byte[1], mp3_vol.byte[1]);

   






//Serial.println(nomberCondition2);
       counter = regulator(); // подсчитываем счетчик через фугнкцию регулятора
       temp = thermistor(); //снимаем показания термистора через  функцию

if ( counter==0){ // выбор режима дискодэнс
 disco_Dance(); }


if (digitalRead(button)==LOW && counter>3){ // если кнопка нажата 
      relay(temp,counter);
         
        
 }
      
if (digitalRead(button)==HIGH && counter>3){ // если кнопка не нажата  
      IDTrec1=0; 
      led(counter); // показываем счетчик
      digitalWrite(rele, HIGH); // реле выключить


      if (nomberCondition2==2){ //если стоял подогрев и кнопку отжали
        nomberCondition2=0; //  то переводим режим в исходное
        IDTrec=8;
        if(IDTrec1!=IDTrec){nameTrec=RandomTrec(401,408); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // оповещаем о выключении поддержания температуры 
      }
      if(nomberCondition2==1){ // если стояло кипячение и кнопку отжали  
        IDTrec=9;
       if(IDTrec1!=IDTrec){nameTrec=RandomTrec(200,300); parse_menu('p', nameTrec ); IDTrec1=IDTrec;} // то ругаемся 
        nomberCondition2=0; // и переводим в исходный режим
        }
      if (temp==0 && nomberCondition2==0){
       IDTrec=10;
       if(IDTrec1!=IDTrec && nomberCondition==1){nameTrec=RandomTrec(100,130); parse_menu('p', nameTrec ); IDTrec1=IDTrec; } // если кнопка не нажата и нет чайника, то что-то говорим
       nomberCondition=0;
      }
      if (temp!=0){
       nomberCondition=1;
        }
      
} 




      
}













 

anton_1992
Offline
Зарегистрирован: 14.11.2015

cudla1973 пишет:

Мне интересно как сделана часть которая измеряет температуру схему бы?

Не буду чужие идеи выдавать за свои, так что вот: http://greenoakst.blogspot.com.by/2012/03/arduino.html

В самом чайнике уже стоял терморезистор, так что мне пришлось его только откалибровать методом "залить кипяток и записывать сопротивление по мере снижения температуры" и припоять к схеме.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

фигассе! о_О

молодец!

ща придут спецы и начнут критиковать, так что запасайся попкорном ;)

а моих знаний хватает только понять об чём речь.

anton_1992
Offline
Зарегистрирован: 14.11.2015

karl2233 пишет:

фигассе! о_О

молодец!

ща придут спецы и начнут критиковать, так что запасайся попкорном ;)

а моих знаний хватает только понять об чём речь.

Я же говорю, что писал код пару месяцев(в основном из-за ссылок на дачу и собственной лени), там много чего использовалось в самом начале и в конечном итоге отверглось как глючное и неразумное и так до конца не удалилось или же сохранилось на лучшие времена для истории) 

cudla1973
Offline
Зарегистрирован: 21.02.2013

anton_1992 пишет:

cudla1973 пишет:

Мне интересно как сделана часть которая измеряет температуру схему бы?

Не буду чужие идеи выдавать за свои, так что вот: http://greenoakst.blogspot.com.by/2012/03/arduino.html

В самом чайнике уже стоял терморезистор, так что мне пришлось его только откалибровать методом "залить кипяток и записывать сопротивление по мере снижения температуры" и припоять к схеме.

я имел ввиду ,чайник же снимается с подставки для него тоже контакты нужны для датчика . или как сделано не пойму?

anton_1992
Offline
Зарегистрирован: 14.11.2015

Чайник покупной и в нем уже стоял термодатчик и имелся соответствующий контакт. Вего их у него 5: один корпус, два на нагреватель и два на термодатчик) Реагирует на поднятие чайника по термодатчику: при разомкнутом контакте показания всегда по нулям. 

cudla1973
Offline
Зарегистрирован: 21.02.2013

anton_1992 пишет:

Чайник покупной и в нем уже стоял термодатчик и имелся соответствующий контакт. Вего их у него 5: один корпус, два на нагреватель и два на термодатчик) Реагирует на поднятие чайника по термодатчику: при разомкнутом контакте показания всегда по нулям. 

Круто , у меня нет такого чайника вот и мудрю как его там сделать, уже давно .

Araris
Offline
Зарегистрирован: 09.11.2012

Меня больше всего тронуло четырёхкратно повторённое выражение "counter=counter;", в голове вдруг заиграла мелодия https://www.youtube.com/watch?v=dq7c-KDJxHQ, если кто помнит.

Ну, а если серьёзно, то даже не очень верится, что это "второй проект после мигания светодиодом на 13 порту", респект автору и пожелание дальнейшего прогресса.

 

anton_1992
Offline
Зарегистрирован: 14.11.2015

Araris пишет:

Меня больше всего тронуло четырёхкратно повторённое выражение "counter=counter;", в голове вдруг заиграла мелодия https://www.youtube.com/watch?v=dq7c-KDJxHQ, если кто помнит.

Ну, а если серьёзно, то даже не очень верится, что это "второй проект после мигания светодиодом на 13 порту", респект автору и пожелание дальнейшего прогресса.

 

Большое Спасибо!)