Предлагаем необычный проект – весы в вечно актуальном стиле “ретро”, где результат отображается на стрелочном индикаторе, вместо банального ЖК-дисплея.
Принципиальная схема аналоговых весов
Детали и модули для сборки весов
- Ардуино Нано R3
- Тензодатчик 5 кг
- Коммутационная плата HX711
- Стрелочный вольтметр
- Подстроечный потенциометр 10 кОм
- Резистор на 470 Ом
- Светодиод 4 шт.
- Переключатель
Вместо стрелочника можем использовать вольтметр на 5 В, в этом случае следует удалить подстроечный потенциометр на 10 кОм. Хотя конечно так весы потеряют свой шарм, превратившись в очередное китайское изделие.
Как известно, в электронных весах используется тензодатчик, который представляет собой преобразователь для создания электрического сигнала, величина которого прямо пропорциональна измеряемой силе. Данный сигнал необходимо усилить и обработать, и эту функцию выполняет небольшая коммутационная плата с микросхемой HX711 – 24-битный высокоточный аналого-цифровой преобразователь.
Обычно калибровка и окончательный результат отображаются на ЖК-дисплее или на последовательном мониторе, но в этом случае изменен стандартный код, чтобы процесс калибровки отображался с помощью светодиодов, а вес – на аналоговом приборе.
Таким образом, в дополнение к необычному ретро-виду, модификация значительно упрощает создание устройства, состоящего, по-сути, всего из нескольких компонентов: микроконтроллер Ардуино, тензодатчик, HX711, аналоговый вольтметр и детали мелочевки.
Хотя блок предназначен для взвешивания до 5 кг, в коде установлен максимальный вес до 1 кг – для более высокого разрешения при измерении малых весов.
После включения сначала тестируется вольтметр – стрелка перемещается в конечное положение и возвращается. При отклонении от отмеченной шкалы калибровка выполняется с помощью подстроечного потенциометра. Загорается синий светодиод, указывая на процесс самокалибровки весов. При этой процедуре производят обнуление, пренебрегая весом плиты, на которой находится мерный груз.
После этого загорается желтый светодиод – это признак того, что нужно поставить известный вес, который заранее определен в коде (в нашем случае 100 грамм). Когда калибровка завершена, загорается белый светодиод – весы готовы к измерению.
#define DT A0
#define SCK A1long sample=0;
float val=0;
long count=0;
int WEIGHT=0;unsigned long readCount(void)
{
unsigned long Count;
unsigned char i;
pinMode(DT, OUTPUT);
digitalWrite(DT,HIGH);
digitalWrite(SCK,LOW);
Count=0;
pinMode(DT, INPUT);
while(digitalRead(DT));
for (i=0;i<24;i++)
{
digitalWrite(SCK,HIGH);
Count=Count<<1;
digitalWrite(SCK,LOW);
if(digitalRead(DT))
Count++;
}
digitalWrite(SCK,HIGH);
Count=Count^0x800000;
digitalWrite(SCK,LOW);
return(Count);
}void setup()
{
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
pinMode(SCK, OUTPUT);delay(500);
test();
calibrate();
}void loop()
{
count= readCount();
int w=(((count-sample)/val)-2*((count-sample)/val));WEIGHT = map(w,0,1000,0,255);
analogWrite (6,WEIGHT);
}void calibrate()
{
digitalWrite(7, HIGH);for(int i=0;i<100;i++)
{
count=readCount();
sample+=count;
}
sample/=100;digitalWrite(7, LOW);
digitalWrite(8, HIGH);
count=0;
while(count<1000)
{
count=readCount();
count=sample-count;
}delay(2000);
for(int i=0;i<100;i++)
{
count=readCount();
val+=sample-count;
}
val=val/100.0;
val=val/100.0; // put here your calibrating weightdigitalWrite(8, LOW);
digitalWrite(10, HIGH);
}
void test() {
for (int i=1;i<=255;i++)
{
analogWrite (6, i);
delay (15);
}
for (int i=255;i>=1;i–)
{
analogWrite (6, i);
delay (15);
}
}
Устройство монтируется в подходящий корпус из ПВХ-плиты толщиной 3 миллиметра.