Попросил меня друг сделать ему такое устройство что бы при включении электролобзика автоматически включался пылесос, а при выключении лобзика пылесос выключался с задержкой в 5 секунд. Я полез в интеренет, нашел кучу схем. Но они мне показались не интересными и я решил делать на микроконтроллере и датчике тока. И вот что получилось.
Код (C++): float current=0; const int currentPin = A0; int k=0; const unsigned long sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains const unsigned long numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up const unsigned long sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time const int adc_zero = 510; // relative digital zero of the arudino input from ACS712 (could make this a variable and auto-adjust it) #define LEDPIN 13 // Вывод светодиода void setup() { Serial.begin(9600); pinMode(LEDPIN, OUTPUT); // Вывод светодиода в режим вывода } void loop() { CurrentSense(); if(current!=0) { digitalWrite(LEDPIN, HIGH); // ... иначе включить светодиод, delay(5000); } else { digitalWrite(LEDPIN, LOW); // Выключить светодиод, если current равен 0... } } void CurrentSense() { unsigned long currentAcc = 0; unsigned int count = 0; unsigned long prevMicros = micros() - sampleInterval ; while (count < numSamples) { if (micros() - prevMicros >= sampleInterval) { int adc_raw = analogRead(currentPin) - adc_zero; currentAcc += (unsigned long)(adc_raw * adc_raw); ++count; prevMicros += sampleInterval; } } float rms = sqrt((float)currentAcc/(float)numSamples) * (50 / 1024.0); rms=rms-0.10; if (rms<0.20) { rms=0; } current=rms; }
В следующий раз попробуйте сделать заливку пустых областей на плате. Чем меньше фольги травится, тем дольше будет работать раствор. Посмотрите, как сделаны фабричные платы. Можно заливку сделать земляным полигоном.
Я хотел сделать заливку, но побоялся ведь на плате дорожки с высоким и низким напряжением. По этому решил не экономить на персульфате аммония. Раствор не одноразовый на нем развел около 6 плат. Просто первые травились минут 15, а эта около двух часов. Блок питания использовал от старой нокиевской зарядки.
Хотел повторить ваше устройство но при компиляции скетча вылезает ошибка: sketch_feb22a:22: error: continue statement not within a loop continue; ^ exit status 1 continue statement not within a loop Увы, в прошивках я не разбираюсь.
absolut, это твой скетч некорректен. В С нет такой конструкции Код (C++): if(current!=0) { digitalWrite(LEDPIN, HIGH); // ... иначе включить светодиод, delay(5000); continue; // --> ЭТО ТОЛЬКО В ЦИКЛАХ ДОПУСТИМО } else { digitalWrite(LEDPIN, LOW); // Выключить светодиод, если current равен 0... } цикла нет. Ну или я не вижу
Я не спорю. Я не програмист. Я взял пример работы с датчиком. Добавил условие в код. И у меня заработало. И заработало корректно. Именно так как мне надо. Если вы шарите в С, то помогите.
И нафига выкладывать что-то в сеть, если вы не программист и даже не разбираетесь, как этот код работает?
absolut большое спасибо за помощь и свое устройство! Удалил функцию continue и все заработало, боялся что будут ложные срабатывания у инструмента с подсветкой, но все работает отлично. Единственное, при первой подаче питания на плату происходит кратковременное срабатывание реле, переназначил пин, вроде все как надо.