Сообщество - TECHNO BROTHER

TECHNO BROTHER

2 085 постов 13 667 подписчиков

Популярные теги в сообществе:

89

Ответ на пост «Европа призвала производителей создавать технику, которую проще ремонтировать»1

На мой взгляд, у этого благого начинания есть и обратная сторона, которая может сильно не понравится пользователям. Экология и все прочее - это весьма полезно, но...

Наше предприятие делает сложные агрегаты - сублиматоры. Понятно, что наше оборудование, в основном, предназначено для промышленности, но мы делаем также небольшие аппараты, которые покупают всякие ИП и самозанятые для того, чтобы делать на этих аппаратах свой маленький гешефт.

Если нас обяжут выпускать запасные части еще десять лет после выпуска какого-либо образца техники, то:

1. Мы не сможем совершенствовать свои сублиматоры, потому что за последние 3 года мы провели 7 глобальных модернизаций, направленных на улучшение потребительских свойств и, и по возможности, снижения цены конечного изделия. Если мы будем к каждой модели вынуждены выпускать 10 лет запчасти, то это сократит частоту модернизаций, и сделает невозможным такое быстрое обновление. Пользователь будет получать заведомо устаревшую технику, из-за того, что заведомо лучшее решение в схемотехнике, насосах, прокладках, вентилях, клапанах и прочем, нам внедрить будет невозможно, так как это внедрение увеличит перечень выпускаемых запчастей до космических величин, и мы просто не сможем этого осилить.

2. Стоимость любого изделия, выпускаемого нами, значительно увеличится, так как помимо самого изделия, нам надо будет выпустить к нему запчасти, которые будем хранить мертвым грузом еще 10 лет на складе, чтобы, если вдруг понадобится, выдать пользователю. Более того, так как значительная часть компонентов не выпускается нами, придется просто закупать у других производителей и держать на складе, "чтобы было"

3. По истечении указанного срока все компоненты, лежащие на складе, и не востребованные пользователями (не случилось ремонта и продать в ремонтные фирмы не смогли) будут выброшены, чтобы освободить складские помещения, а использовать их уже будет нерационально, так как они устарели и в новых моделях им нет места. Такая вот экология случится.

Думаю, подобная штука будет и в телефонах, компьютерах и прочих компонентах. Так что благими намерениями может быть вымощена дорога в ад.

Показать полностью
280

Европа призвала производителей создавать технику, которую проще ремонтировать1

В 2020 году прокуратура Парижа оштрафовала известного производителя смартфонов за использование обновления, которое снижает скорость работы телефонов старого поколения. Компания оправдалась желанием продлить срок службы батареи, но критики настаивали на «запланированном устаревании». Это практика преднамеренного ограничения функционального срока службы продукта для увеличения продаж новых моделей.

Европа призвала производителей создавать технику, которую проще ремонтировать

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


Таких историй предостаточно: ремонт старого изделия слишком сложный, производитель не предоставляет нужных деталей или специально делает изделие хрупким. Таким образом, потребителей подталкивают к поведению «покупай-используй-выбрасывай-покупай», тратя впустую драгоценные ресурсы нашей планеты.


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


Например, теперь делают крышки для смартфонов из стекла — материала, который обеспечивает лучший прием сигнала и который труднее поцарапать, чем пластик.


Большинство новых смартфонов продаются со встроенными батареями, преимущество которых заключается в том, что они интегрированы в существующие схемы системы, но их гораздо сложнее поменять.


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

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


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


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


Новые правила в соответствии с Директивой Европейской комиссии по экодизайну, опубликованной в 2019 году, вводят ряд положений об эффективности использования ресурсов для продуктов, связанных с энергетикой, включая требования о том, что производители должны предоставлять запчасти.


Специалисты Объединенного исследовательского центра Еврокомиссии выяснили, что жители ЕС покупают новый смартфон каждые два года — в половине случаев, когда старый еще работает. Важно показать пользователям, что гаджет выбрасывать не обязательно: качественный ремонт продлит срок его службы.

Показать полностью
1798

Моя версия наливатора

Сделан по просьбе друга, в подарок его начальнику. Вдохновлялся проектом Алекса Гайвера, все остальное - полет фантазии и переделки в процессе создания.

72

Как сделать тетрис классический

Дисплей от Nokia 5110 - это наверное самый дешевый дисплей который можно найти для своих проектов на Arduino. На базе него мы разберемся с вопросом: "Как же сделать тетрис-игру?@

Основная проблема всех библиотек для рисования на этом дисплее - отсутствие поддержки русского языка. Решается установкой дополнительных шрифтов, которые подменяют английские символы на русские.

Избалованные i2c шиной скажут "фу", ведь у нас 4 провода управления SCLK, DIN, DC, CE и RTS которые соответственно подключаются к Arduino, 3, 4, 5, 6, 7. Не забываем подключить питание 3.3 вольта, и землю.

Для рисования будем использовать библиотеку Adafruit GFX Library. В архиве с ней есть примеры использования.

Для управления игрой используем ИК пульт от телевизора. Сигнал будет принимать датчик TL1838.

Я использовал Arduino Uno, т.к. она уже имеет стабилизатор на 3.3 вольт.

Подключение IR приемника:

pin 8 — IR (управляющий). Питание на +5V и GND.

Подключение пьезодинамика:

pin 9 — speaker, Земля на GND.


Скетч тетриса:


// © Klop 2017
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <IRremote.h>
#include <EEPROM2.h>
#define rk 4 // ширина квадратика
#define rz 5 // ширина места
#define smeX 1
#define smeY 1
#define MaxX 10 // стакан кол-во мест по гориз
#define speaker 9
#define RECV_PIN 8 // нога на IRDA приемник
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
IRrecv irrecv(RECV_PIN);
decode_results results;
byte mstacan[MaxX][30];
byte Lst,SmeH, center, NumNext;
byte MaxY; // стакан кол-во мест по вертик
int dxx, dyy, FigX, FigY, Victory, myspeed,tempspeed;
unsigned long ok, levo, pravo, vniz, myrecord;
unsigned long flfirst=1234; // метка первого запуска
byte fig[][4][4]=
{
{{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,1,0,0}},
{{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,0,0},
{0,1,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},
{{0,0,1,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},
{{0,0,1,0},
{0,0,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,0,0,0}, //8
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}}
};
//==============================================
void mybeep() // звук
{analogWrite(speaker, 100);
delay(100);
analogWrite(speaker, 0);
}
//==============================================
void figmove(byte a, byte b)
{
for (byte i=0;i<4;i++)
for (byte j=0;j<4;j++)
fig[a][i][j]=fig[b][i][j];
}
//==============================================
void figinit(byte a)
{
for (byte i=0;i<4;i++)
for (byte j=0;j<4;j++)
{
fig[0][i][j]=fig[NumNext][i][j];
if (fig[a][j][i]==1) // покажем след фигуру
display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, BLACK);
else display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, WHITE);
}
display.display();
NumNext=a;
tempspeed=myspeed;
dxx=0;
for (byte i=0;i<MaxX;i++)
if (mstacan[i][3]==2) newgame();
}
//==============================================
void viewstacan()
{
display.drawLine(0,0,0,display.height()-1, BLACK);
display.drawLine(0,display.height()-1,Lst, display.height()-1, BLACK);
display.drawLine(Lst,display.height()-1,Lst,0, BLACK);
for (byte j=4;j<MaxY;j++)
for (byte i=0;i<MaxX;i++)
if (mstacan[i][j]>0)
display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, BLACK);
else display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, WHITE);
ds(Victory,1);
display.display();
}
//================================================
void ds(int aa, int b)
{
display.fillRect(55, 10, 29, 10, WHITE);
display.setCursor(55,b*10);
display.println(aa);
}
//================================================
bool iffig(int dx, int dy)
{int i,j;
bool flag=true; bool pov=false;
for (i=0;i<MaxX;i++)
for (j=0;j<MaxY;j++)
if (mstacan[i][j]==1)
mstacan[i][j]=0; // убрали временно фигуру
if (dx==2) // поворот
{ dx=0; pov=true;
figmove(8,0);
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{ fig[0][i][j]=fig[8][3-j][i];
if (fig[0][j][i]==1)
{ if (i+FigX+dx<0) dx=1; // пробуем отодвинуть от стенки слева на 1
if (i+FigX+dx>MaxX-1) dx=-1;// пробуем отодвинуть от стенки справа на 1
}
}
}
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
if (i+FigX+dx<0 || i+FigX+dx>MaxX-1 || FigY+j+dy>MaxY-1 || mstacan[i+FigX+dx][FigY+j+dy]>0)
{flag=false; break;} // проверили на новые координаты
if (flag)
{FigX=FigX+dx; FigY=FigY+dy;byte k=0;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
{mstacan[i+FigX][j+FigY]=1;
dxx=0;
}
} // переместили фигуру на новые координаты
else
{ if (pov) {figmove(0,8);}
for (i=0;i<4;i++) // восстановили фигуру
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
mstacan[i+FigX][j+FigY]=1;
}
return(flag);
}
//================================================
void clearstacan()
{
for (byte i=0;i<MaxX;i++)
for (byte j=0;j<MaxY;j++)
mstacan[i][j]=0;
}
//================================================
unsigned long getbutton(char s[])
{unsigned long tt;
display.fillRect(5, 30, 40, 10, WHITE);
display.setCursor(5,30);
display.print(s);
display.display();
while (true)
if (irrecv.decode(&results;)) // ловим код кнопки пульта
{ tt=results.value;
delay(400);
irrecv.resume();
break;
}
return(tt);
}
//================================================
void newgame()
{ unsigned long tb;
dxx=0; dyy=1;
display.setCursor(0,0);
clearstacan();
NumNext=random(7)+1;
figinit(random(7)+1);
center=MaxX/2-2;
FigX=center;FigY=0;
display.setCursor(52,0);
display.println("Линий");
viewstacan();
if (Victory>myrecord)
{ myrecord=Victory;
EEPROM_write(16, myrecord);
}
display.setCursor(5,0);
display.print("Рекорд");
display.setCursor(5,10);
display.print(myrecord);
display.display();
display.setCursor(5,20);
delay(2000);irrecv.resume();
display.println("Нажмите");
tb=getbutton(" OK");
if (tb!=ok)
{ ok=tb;
levo=getbutton("Влево");
pravo=getbutton("Вправо");
vniz=getbutton("Вниз");
EEPROM_write(0, ok);
EEPROM_write(4, levo);
EEPROM_write(8, pravo);
EEPROM_write(12, vniz);
}
display.fillRect(5, 0, (MaxX-1)*rz, 40, WHITE);
myspeed=800; tempspeed=myspeed;
Victory=0;
}
//================================================
void setup()
{ unsigned long tr; word gg=0;
randomSeed(analogRead(0));
irrecv.enableIRIn(); // Старт ресивера IRDA
display.begin();
display.setContrast(50);
display.setTextSize(1);
display.setTextColor(BLACK); // установка цвета текста
display.clearDisplay();
Lst=rz*MaxX; // ширина стакана в пикселях
MaxY=display.height()/rz+4; // Высота стакана в кубиках
SmeH=display.height()%rz; // смещение сверху в пикселях для отображения
random(7);
EEPROM_read(0, ok);
EEPROM_read(4, levo);
EEPROM_read(8, pravo);
EEPROM_read(12, vniz);
EEPROM_read(20, tr);
if (tr==flfirst) EEPROM_read(16, myrecord);
else { myrecord=0;
EEPROM_write(16, myrecord);
EEPROM_write(20, flfirst);
}
newgame();
}
//================================================
void dvoiki()
{
for (byte i=0;i<MaxX;i++)
for (byte j=0;j<MaxY;j++)
if (mstacan[i][j]==1)
mstacan[i][j]=2;
}
//================================================
void mydelay(int md)
{
unsigned long starttime=millis();
while (millis()-starttime<md)
{
if (irrecv.decode(&results;)) // ловим код кнопки пульта
{
if (results.value==levo) dxx=-1; else
if (results.value==pravo) dxx=1; else
if (results.value==ok) dxx=2; else
if (results.value==vniz) {tempspeed=100; md=0;}
if (dxx!=0) {iffig(dxx,0); viewstacan(); }
delay(40); // убираем дребезг
irrecv.resume();
}
}
}
//================================================
bool iffs() // есть ли полные строки?
{
bool res=false;
for (byte j=0;j<MaxY;j++)
{
bool fl=true;
for (byte i=0;i<MaxX;i++)
if (mstacan[i][MaxY-1-j]==0) fl=false;
if (fl)
{
Victory++;
myspeed=myspeed-(Victory/30)*50; // через каждые 30 линий увеличим скорость падения
if (myspeed<0) myspeed=0;
res=true; mybeep();
for (byte k=0;k<MaxX;k++)
for (byte n=j;n<MaxY-2;n++)
mstacan[k][MaxY-n-1]=mstacan[k][MaxY-n-2];
viewstacan();
}
}
return(res);
}
//================================================
void loop()
{ if (!iffig(dxx,dyy))
if (!iffig(0,dyy))
{ dvoiki();
figinit(random(7)+1);
FigX=center;FigY=0;
while (iffs()) ;
}
viewstacan();
mydelay(tempspeed);
}

Игра поддерживает привязку к любому пульту. Для этого достаточно в начале игры, на вопрос «Нажмите ОК» нажать на пульте кнопку, которая будет отвечать за вращение фигуры. Если пульт игре уже знакомый, то игра сразу запустится. Если пульт новый, то код кнопки ОК не совпадет с запомненным и игра потребует последовательно нажать кнопки «Влево», «Вправо» и «Вниз». Эти кнопки будут записаны в энергонезависимую память Ардуино и впоследствии именно этот пульт будет узнаваться сразу по нажатию кнопки «ОК».


При «проваливании» на собранную строку будет воспроизводиться писк. Он реализован на особенности нескольких пинов Ардуино (в нашем случае 9) выдавать ШИМ с заданной частотой. Игра поддерживает все атрибуты нормальной игры. Ту и подсказка следующей фигуры и текущий счет. Игра ведет учет рекордов. Это значение хранится в энергонезависимой памяти Ардуино. Чтобы сбросить рекорд, достаточно изменить в скетче значение flfirst=1234 на любое другое. В игре также идет автоувеличение скорости падения через каждые 30 списанных строчек, так что, бесконечно долго поиграть не получится ). Скетч не оптимизировался и тщательно не прогонялся, а был написан на досуге в свое удовольствие. Если кто обнаружит ошибку — пишите. О ©. Скетч разрешается править для себя как угодно. Только при публикации где-либо своих вариантов ссылку на первоисточник-муську указывайте ). Для чего делал — длинные выходные + «из любви к искусству». Была бы дочка маленькой, сделал бы ей, наверное, мини игровой автомат для кукольной комнатки на 8 марта, как раз успел бы. Добавил бы несколько игр типа Змейки и Арканоида, а корпус вырезал бы из текстолита, наверное. Только дочка в этом году уже докторскую защищает, так, что мимо, но может кому еще эта идея пригодится ).

Показать полностью 4
423

Неведомая электрическая штука с пружинами

Рядом с Иркутским техническим университетом была найдена такая штуковина:

На концах пружины:

Середина сложной выточенной формы:

В продолговатом отверстии утолщения видны провода:

Поиск в интернете по картинкам находит посторонние вещи: глушители, отвёртки, держатели лерок.


Что это за штука?

Показать полностью 6
192

Измеряем толщину ЛКП на Arduino

Измерение толщины лакокрасочного покрытия автомобиля сводится к простому измерению индуктивности катушки с полуоткрытым сердечником.

Самая сложная часть нашей установки - катушка индуктивности. Она состоит из одной обмотки внутри половинки броневого ферритового сердечника из какой-то радио аппаратуры. Если мы будем прислонять катушку открытой стороной к эелезной пластине (кузову), то чем меньше зазор между обкладками ферритового корпуса, то тем выше индуктивность. Параметры катушки серьезного значения не имеют т.к. схема будет калиброваться.

В моем случае использовалась проволока 0.08 мм для намотки порядка 100 витков. Что бы увеличить ответный сигнал с катушки цепляем параллельно металлопленочный конденсатор 100 пф. Получился колебательный контур чувствительный к толщине ЛКП.

Измерять частоту колебаний контура будет Arduino Nano. В зависимости от результатов измерений будут зажигаться 7 диодов-индикаторов. Они будут сигнализировать о толщине окрашенной панели. При правильной калибровке у незамкнутого сердечника магнитопровода будут гареть все диоды (металла нет - шпаклевка), при замыкании вплотную к голому металлу должен гореть один диод (металл). Чувствительность срабатывания остальных индикаторов нужно измерять экспериментально под вашу катушку.

Перед использованием измерителя толщины краски нужно выполнить калибровку. Прикладываем датчик к голому магнитному металлу (сталь) и нажимаем кнопку "калибровка". Тем самым в энергонезависимую память Arduino будет сохранен коэффициент измерения. От него будет выполняться отсчет остальных уровней индикации.

Для выполнения измерения прикладываем датчик к кузову автомобиля и нажимаем вторую кнопку "измерение". Индикаторы покажут измеренную толщину краски на кузове.

Скетч программы для Arduino:

// программа - Измеритель-толщины покрытия.
// идея отсюда: https://github.com/sae/Arduino-LCQmeter/blob/master/LC-gen.i...
/*
simplest LC-generator on arduino
can be used as lc-meter
(C)SAE762 07.feb.2015 @home
circuit diagramm D2---R(100...1000)---D6---LC---GND; D7---GND
*/
#include <EEPROM.h> // библиотека чтения-записи eeprom
#include "analogComp.h" // библиотека, скчана с гитхаба
/* проверка работы eeprom
*/
//***************** ФУНКЦИИ***********
//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
// эта функия записывает двухбайтовое целое число в РППЗУ по указанному адресу
void EEPROMWriteInt(int p_address, int p_value)
{
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}
//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
// эта функия считывает двухбайтовое целое число в РППЗУ по указанному адресу
unsigned int EEPROMReadInt(int p_address)
{
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);
return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
//********конец объявления фунций************
//обявление переменных
int ctl=2 ; // нога для накачки энергии в контур
int led=13; // нога светодиода
int rise=0; // счетчик переходов через 0
int fall=0; // такой же стетчик
int summ; //накопительный счетчик
int tchk=300; // время измерения
int zero=11625; //отладка
int delta=0; //разница между содержимым eeprom и результатом измерения
//присвоим номера пинов светодиодов
int vbat=0; //напряжение батареи
int vbatpin=6; // аналог вход 6
int mredled=3; // красный светодиод -
int mblueled=4; //синий светодиод -
int mwhiteled=5;//белый светодиод -
int greenled=8;//зеленый светодиод
int pwhiteled=9;//белый светодиод +
int pblueled=10; //синий +
int predled=11; //красный +
// присвоим границы
//++++++++++++++++++++++++++++++++
// тут придется внести ВАШИ значения!!!!
//===============================
int pgreen=25; // граница ОК в плюс
int mgreen=-10;// в минус
int pwhite=55; // граница подозрительно в +
int mwhite=-30;// подозрительно в -
int pblue=100; // крашено
int mblue=-60; // шлифовано
//int pred=130; // шпаклевка
//int mred=-60;//металл
void setup() {
// put your setup code here, to run once:
summ=0;// инициализация накопителя
Serial.begin(9600); // настроим порт УБРАТЬ ПОСЛЕ ОТЛАДКИ
pinMode(led, OUTPUT); //
pinMode(ctl, OUTPUT); // инициализация выхода накачки
//настроим выхода под светодиоды
pinMode(mredled, OUTPUT);
digitalWrite(mredled, HIGH);
pinMode(mblueled, OUTPUT);
digitalWrite(mblueled, HIGH);
pinMode(mwhiteled, OUTPUT);
digitalWrite(mwhiteled, HIGH);
pinMode(greenled, OUTPUT);
digitalWrite(greenled, HIGH);
pinMode(pwhiteled, OUTPUT);
digitalWrite(pwhiteled, HIGH);
pinMode(pblueled, OUTPUT);
digitalWrite(pblueled, HIGH);
pinMode(predled, OUTPUT);
digitalWrite(predled, HIGH);
// тут можно дорожку сделать для индикации светодиодов, если очень хочется
// инициализация компаратора и прерываний
digitalWrite(ctl, LOW);
analogComparator.setOn(AIN0, AIN1);//D6+,D7-
analogComparator.enableInterrupt(comparatorInt,CHANGE);
// проверка режима работа/установка 0
vbat = analogRead(vbatpin); // считываем значение
if (vbat>50) { // если напруга больше 0 запускаем установку 0
rise=0;
// индикация разряженной батареи, но установка 0 продолжается
if (vbat < 700) {digitalWrite(mredled, LOW);digitalWrite(predled, LOW);}
//if no pulses, make a start impulse
if (rise==0) {
pulse();
}
// первый проход
summ=0;
digitalWrite(led, LOW);
rise=0;
fall=0;
delay(tchk); // wait for a second
//Serial.println(rise); // вывод на псолед порт, убрать после отладки
summ=summ+rise;
// второй проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
//третий проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise-15; // -15 странный костыль видимо недосчет во время обработки прерывания
// Serial.print(summ); // убрать после отладки
//вычислим среднее
summ=summ/3; // вот это и есть измренное значение по результатам трех проходов
// это условная толщина покрытия в попугаях
// зная ее, можно с помомощью нехитрых арифметических действий, определить реальную толщину покрытия
//то есть померить калиброванную пленку разной толщины, записать результаты, а потом подобрать коэффициенты.
digitalWrite(led, HIGH);
EEPROMWriteInt(0,summ); //занесем в eeprom
digitalWrite(greenled, LOW); // зажжем зелененький
while (1); // застопорить нахрен после установки 0 !!!!!!!
}
}
// конец процедуры установки
// тут переход к процедуре измерения
//!!!!!Главный цикл!!!
void loop() {
// тут процедура измерения
rise=0;
//Serial.println(EEPROMReadInt(0)); // выводим полученное значение
//if no pulses, make a start impulse
if (rise==0) {
pulse();
}
// первый проход
summ=0;
digitalWrite(led, LOW);
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
// второй проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
//третий проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
// Serial.print(rise);
//вычислим среднее
summ=summ/3;
delta=summ-EEPROMReadInt(0);
Serial.print(EEPROMReadInt(0)); // из памяти
Serial.print(";");
Serial.print(delta);
Serial.println(" pulses/tchk");
digitalWrite(led, HIGH);
if (delta >= mgreen && delta <= pgreen ) {digitalWrite(greenled, LOW);}
if (delta < mblue) digitalWrite(mredled, LOW);
if (delta >= mblue && delta < mwhite ) digitalWrite(mblueled, LOW);
if (delta >= mwhite && delta < mgreen) digitalWrite(mwhiteled, LOW);
if (delta > pblue) digitalWrite (predled,LOW);
if (delta > pwhite && delta <= pblue) digitalWrite (pblueled,LOW);
if (delta > pgreen && delta <= pwhite) digitalWrite (pwhiteled,LOW);
while (1); /// тормоза. измерение окончено
delay(1000); // wait for a second
}
/**
not so clear "magic" with interrupt
we need to block int's when make a power impulse
comparator is connected directly to capacitor
*/
boolean waitforRise=false;
//this function is called when comparator change status
//as set in ACSR register
void comparatorInt() {
if (waitforRise) { //if we waiting for rise
ACSR &= ~(1<<ACIS0);//set interrupt for falling
ACSR |= (1<<ACIS1);
waitforRise=false;
rise++;
} else { //if we waiting for fall
ACSR &= ~(1<<ACIE); //disable interrupt
//impulse to support an oscillations
pulse();
ACSR |= (1<<ACIE); //enable interrupt
ACSR |= ((1<<ACIS1) | (1<<ACIS0)); //set interrupt for rising
waitforRise=true;
}
}
//send power impulse to LC
void pulse() {
pinMode(ctl, OUTPUT);
digitalWrite(ctl, HIGH);
rise++;//make something useless )
//digitalWrite(ctl, LOW);
pinMode(ctl, INPUT);
}

Устройство не гарантирует точность измерений т.к. в нем не учитывается температура и уровень напряжения питания устройства. Эти переменные могут вилять на результат измерения, что в свою очередь увеличит погрешность измерения. Но как проект весьма интересен

Показать полностью 4
Отличная работа, все прочитано!