Робочайник200
- Войдите на сайт для отправки комментариев
Всем привет! Пошел я когда-то в армию погулять и мои в мое отсутствие сожгли керамический чайник с электронным управлением. По возвращения с армии было установлено, что сгорела какая-то подлая деталька в схеме управления и естественно меня заставили ее чинить. А так как я плохо разбираюсь в поиске подлых сгоревших деталек, то просто выкинул всю плату и решил создать что-то свое. Тут на злаза как раз попалась тема про Ардуино, ну и понеслось...)
Не думаю что я сделал что-то оригинальное, поэтому обойдусь минимальным описание и видео из которого более менее понятно как сам чайник сшит. Вот собственно видео: https://youtu.be/5lYGfQUlpm0 (заранее извиняюсь за ссылку, у Вас за них вообще банят?).
А вот и краткое описание: чайник умеет показывать температуру воды, умеет копятить ее до заданного уровня и поддерживать в течении длительного времени, умеет оповещать всех окружающих о том что он закипел и о том что ему не нравиться в дествиях человека в отношении его. Воду охлаждать не умеет и поэтому обижается, когда ставишь температуру ниже текущей в чайнике. Вся озвучка записана через синтезатор речи и проигрывается в псевдослучайном порядке при определенных условиях. На борту также имеются часы реального времени, так что свои вопли он прекращает где-то в районе 10-11 вечера и молчит до 9 утра)
Код программы я выложу только если попросите... там несовсем чисто... очень много мусора, ненужных переменных, нужда в которых отпала в процессе длительного создания кода, много закоменченых нерабочих участков и прочей ерунды.
Внимание! Это мой первый проект, так что критикуйте так чтобы у меня навсегда отпало желание сотворять подобные бесполезные вещи)
прикольно получилось.
теперь критика: критикую, только не понятно что критиковать - ни кода, ни схемы.
Мне интересно как сделана часть которая измеряет температуру схему бы?
ну Вы напросились...!) Это мой второй проект после мигания светодиодом на 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; } } }Мне интересно как сделана часть которая измеряет температуру схему бы?
Не буду чужие идеи выдавать за свои, так что вот: http://greenoakst.blogspot.com.by/2012/03/arduino.html
В самом чайнике уже стоял терморезистор, так что мне пришлось его только откалибровать методом "залить кипяток и записывать сопротивление по мере снижения температуры" и припоять к схеме.
фигассе! о_О
молодец!
ща придут спецы и начнут критиковать, так что запасайся попкорном ;)
а моих знаний хватает только понять об чём речь.
фигассе! о_О
молодец!
ща придут спецы и начнут критиковать, так что запасайся попкорном ;)
а моих знаний хватает только понять об чём речь.
Я же говорю, что писал код пару месяцев(в основном из-за ссылок на дачу и собственной лени), там много чего использовалось в самом начале и в конечном итоге отверглось как глючное и неразумное и так до конца не удалилось или же сохранилось на лучшие времена для истории)
Мне интересно как сделана часть которая измеряет температуру схему бы?
Не буду чужие идеи выдавать за свои, так что вот: http://greenoakst.blogspot.com.by/2012/03/arduino.html
В самом чайнике уже стоял терморезистор, так что мне пришлось его только откалибровать методом "залить кипяток и записывать сопротивление по мере снижения температуры" и припоять к схеме.
я имел ввиду ,чайник же снимается с подставки для него тоже контакты нужны для датчика . или как сделано не пойму?
Чайник покупной и в нем уже стоял термодатчик и имелся соответствующий контакт. Вего их у него 5: один корпус, два на нагреватель и два на термодатчик) Реагирует на поднятие чайника по термодатчику: при разомкнутом контакте показания всегда по нулям.
Чайник покупной и в нем уже стоял термодатчик и имелся соответствующий контакт. Вего их у него 5: один корпус, два на нагреватель и два на термодатчик) Реагирует на поднятие чайника по термодатчику: при разомкнутом контакте показания всегда по нулям.
Круто , у меня нет такого чайника вот и мудрю как его там сделать, уже давно .
Меня больше всего тронуло четырёхкратно повторённое выражение "counter=counter;", в голове вдруг заиграла мелодия https://www.youtube.com/watch?v=dq7c-KDJxHQ, если кто помнит.
Ну, а если серьёзно, то даже не очень верится, что это "второй проект после мигания светодиодом на 13 порту", респект автору и пожелание дальнейшего прогресса.
Меня больше всего тронуло четырёхкратно повторённое выражение "counter=counter;", в голове вдруг заиграла мелодия https://www.youtube.com/watch?v=dq7c-KDJxHQ, если кто помнит.
Ну, а если серьёзно, то даже не очень верится, что это "второй проект после мигания светодиодом на 13 порту", респект автору и пожелание дальнейшего прогресса.
Большое Спасибо!)