Tensometr i arduino

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Tensometr i arduino

Post autor: andrzej » 3 lut 2016, 22:39

Witam
Na wstępie informuję że jestem totalnie początkujący w dziedzinie tworzenia kodu do arduino , więc proszę o wyrozumiałość.
Stworzyłem taki oto kod który dokonuje pomiaru z belki tensometrycznej i wyświetla wagę na wyświetlaczu problem w tym że nie potrafię dopisać zależności np.
żeby na wyświetlaczu mieć możliwość zadawania jakiejś wagi po której uzyskaniu wysterowane zostało by jakieś wyjście

Taki mały projekcik dozownika wagowego dozowanie zgrubne i precyzyjne przed osiągnięciem zadanej wagi
#include <hx711.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //zdefiniowane piny lcd
Hx711 scale(A1, A0); //zdefiniowane piny tensometru


void setup() { //co będzie użyte w programie
Serial.begin(9600);
lcd.begin(16, 2);


}
void loop() { //główny program

lcd.setCursor(0, 0); //ustawienie kursora
Serial.print("waga ");
Serial.print(scale.getGram(), 0); //ile miejsc po przecinku skala wagi
Serial.println("g");
delay(200);
}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1134
Rejestracja: 18 lis 2011, 02:18

Re: Tensometr i arduino

Post autor: Marhef » 4 lut 2016, 09:59

Krapi, trudno będzie uzyskać dokładną wartość. Nie łatwiej skorzystać z warunku >= ?
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 4 lut 2016, 20:34

witam
dzięki za zainteresowanie tematem dopisałem warunek i działa wielkie dzieki
wygląda to tak:
#include <hx711.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //zdefiniowane piny lcd
Hx711 scale(A1, A0); //zdefiniowane piny tensometru


void setup() { //co będzie użyte w programie
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(2,OUTPUT);

}
void loop() { //główny program
if(scale.getGram() >= 200){
digitalWrite(2,HIGH);
}
else{
digitalWrite(2,LOW);
}
lcd.setCursor(0, 0); //ustawienie kursora
Serial.print("waga ");
Serial.print(scale.getGram(), 0); //ile miejsc po przecinku skala wagi
Serial.println("g");
delay(200);

}
Pomożecie z resztą problemu ? ":)

działanie ma wyglądać w następujący sposób :
-wybieram wagę np. 200 g (wartość którą mogę zmieniać na wyświetlaczu)
-dozownik zaczyna dozować
-po uzyskaniu załóżmy 120 g (wartość którą mogę zmieniać na wyświetlaczu) odpala się wyjście 2
-po uzyskaniu 200 g wyjście 2 gaśnie a załącza się wyjście 3

Zaznaczam że słabo to wszystko kumam ale mam zapał do nauki proszę o wytłumaczenie jak uzyskać taki cykl dozowania.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 4 lut 2016, 21:08

A jak chcesz tą wagę wprowadzać?
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 4 lut 2016, 21:29

poprzez wyświetlacz lcd z przyciskami
np. taki
modul-shield-lcd-arduino-wyswietlacz-klawiatura
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 4 lut 2016, 21:33

A jak tam te przyciski, są zorganizowane? Jak się nie mylę, to one do któreś wejścia analogowego są połączone?
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 4 lut 2016, 21:36

faktycznie masz rację
dokładnie zajmują wszystkie analogi (wyświetlacz jeszcze do mnie nie dotarł jest w trakcie doręczenia)
potrzebuję A0 i A1 do tensometru
jak to rozwiązać ?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 4 lut 2016, 21:37

A czemu akurat A0 i A1? Tylko A0 zajmują przyciski, pozostałe można użyć.
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 4 lut 2016, 21:42

ok
do tensometru mogę użyć innych analogów
masz na pewno rację jak wspomniałem nie mam jeszcze tego wyświetlacza na razie skupiam się na kodzie do puki nie przyjdzie wyświetlacz
podpowiesz co gdzie dopisać by udało się uzyskać ten cykl ?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 4 lut 2016, 21:48

Te przyciski są zrobione na takiej zasadzie jak to jest opisane tutaj http://majsterkowo.pl/drabinka-rezystor ... go-zlacza/
Poczytaj sobie. Najpierw będziesz musiał wgrać program, dzięki któremu odczytasz wartości dla poszczególnych przycisków. Potem znając te wartości będziesz mógł napisać warunki wykrywające wciśnięcie danego przycisku i w ten sposób ustawiać wartość wagi. Na przykład jeden przycisk będzie dodawał, drugi odejmował.

Tutaj piszą, że przyciski korzystają z pinu A0 http://botland.com.pl/arduino-shield-kl ... duino.html
ewentualnie może być inaczej jak gdzieś indziej kupiłeś, ale raczej będzie tak samo.
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 4 lut 2016, 21:53

ok na razie dzięki
poczytam pokombinuje i poczekam na wyświetlacz
jeszcze się odezwę bo coś czuję że sam tego nie ogarnę odwiedzaj temat ":)
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 4 lut 2016, 22:02

Tam na tej stronie jest też do ściągnięcia przykładowy program i tam już są wartości, może nie będziesz musiał sam sprawdzać, jak wgrasz ten program i będzie się poprawnie wyświetlało na wyświetlaczu który przycisk jest wciśnięty. I tam też lepiej jest napisana funkcja wykrywająca wciśnięcie danego przycisku, niż w tym linku na majsterkowie, nie potrzebne są przedziały wartości, tylko najwyższa wartość.
Link do tego programu https://botland.com.pl/index.php?contro ... chment=865
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 8 lut 2016, 21:41

witam
proszę o podpowiedź jakiej komendy użyć by wytarować wagę przyciskiem podpiętym pod pin 4 ?

Proszę o wyrozumiałość dla żółtodzioba ":)
/*
* lcd
* VCC - > 5 V
* GND - GND
* SCL -> A5
* SDA -> A4
*/
/*
*wzmacniacz
*VCC - 3,3V
*GND - GND
*SCK - A0
*DT - A1
*/

#include <hx711.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //adres i zdefiniowane piny lcd
Hx711 scale(A1, A0); //zdefiniowane piny tensometru

//pin 2 = stop ważenie
//pin 3 = stop zgrubne start precyzja
int stop_waga = 2; //deklaracja pinu
int precyzyjne = 3; //deklaracja pinu

void setup() { //co będzie użyte w programie
pinMode (4, INPUT);
pinMode (7, OUTPUT);
lcd.begin(16, 2);
pinMode(stop_waga ,OUTPUT);
pinMode(precyzyjne ,OUTPUT);

lcd.backlight(); // zalaczenie podwietlenia
lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)

lcd.print(" DOZOWNIK");

lcd.setCursor(0,1); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print(" MAX 5 GRAM");
delay(5000);
}
void loop() { //główny program


lcd.setCursor(0,0);



if (digitalRead(4) == HIGH)
{
lcd.setCursor(0,0);
lcd.print("TAROWANIE");
lcd.setCursor(0,1);


lcd.print(scale.getGram(),0);
delay(2000);
digitalWrite(7, HIGH);
}
else
{
digitalWrite(7, LOW);
}


delay(500);

if(scale.getGram() >= 6){ //zadana waga w gramach
digitalWrite(stop_waga ,HIGH); //jak uzyskasz zadaną wysteruj 2
}
else{
digitalWrite(stop_waga ,LOW); //jak nie ma zadanej wygaś 2
}
if(scale.getGram() <= 6){
digitalWrite(precyzyjne ,HIGH);

}
else{
digitalWrite (precyzyjne ,LOW);
}
lcd.setCursor(0, 0); //ustawienie kursora
lcd.print(" DOZOWANIE ");

lcd.setCursor(0, 1);
lcd.print(scale.getGram(),0); //ile miejsc po przecinku skala wagi
lcd.println(" GRAM ");


}

a oto biblioteka

/* Arduino library for digital weight scale of hx711

*/

#ifndef HX711_H_
#define HX711_H_

#include "Arduino.h"

class Hx711
{
public:
Hx711(uint8_t pin_din, uint8_t pin_slk);
virtual ~Hx711();
long getValue();
long averageValue(byte times = 1);
void setOffset(long offset);
void setScale(float scale = -440.f);
float getGram();

private:
const uint8_t _pin_dout;
const uint8_t _pin_slk;
long _offset;
float _scale;
};

#endif /* HX711_H_ */


/*
* Hx711.cpp
*
* Created on: Oct 31, 2012
* Author: agu
*/

#include "hx711.h"

Hx711::Hx711(uint8_t pin_dout, uint8_t pin_slk) :
_pin_dout(pin_dout), _pin_slk(pin_slk)
{
pinMode(_pin_slk, OUTPUT);
pinMode(_pin_dout, INPUT);

digitalWrite(_pin_slk, HIGH);
delayMicroseconds(100);
digitalWrite(_pin_slk, LOW);

averageValue();
this->setOffset(averageValue());
this->setScale();
}

Hx711::~Hx711()
{

}

long Hx711::averageValue(byte times)
{
long sum = 0;
for (byte i = 0; i < times; i++)
{
sum += getValue();
}

return sum / times;
}

long Hx711::getValue()
{
byte data[3];

while (digitalRead(_pin_dout))
;

for (byte j = 3; j--;)
{
for (char i = 8; i--;)
{
digitalWrite(_pin_slk, HIGH);
bitWrite(data[j], i, digitalRead(_pin_dout));
digitalWrite(_pin_slk, LOW);
}
}

digitalWrite(_pin_slk, HIGH);
digitalWrite(_pin_slk, LOW);

data[2] ^= 0x80;

return ((uint32_t) data[2] << 16) | ((uint32_t) data[1] << 8)
| (uint32_t) data[0];
}

void Hx711::setOffset(long offset)
{
_offset = offset;
}

void Hx711::setScale(float scale)
{
_scale = scale;
}

float Hx711::getGram()
{
long val = (averageValue() - _offset);
return (float) val / _scale;
}
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 9 lut 2016, 00:56

Kod: Zaznacz cały

  double odczyt = scale.averageValue(5);
  scale.setOffset(odczyt);
Tutaj jest inna biblioteka https://github.com/bogde/HX711 trochę inne nazwy funkcji są i w tej bibliotece do tarowania jest osobna funkcja scale.tare().

Nie mam w tym tamacie żadnego doświadczenia, ale wygląda na to, że tarowanie tarowaniem, ale żeby waga prawidłowo ważyła, to trzeba zrobić na początek kalibrację. Tutaj jest kod do kalibrowania korzystający z tej biblioteki, co dałem do niej linka https://learn.sparkfun.com/tutorials/lo ... okup-guide

I jakby co, to jeszcze o prawidłowych podłączeniu przycisku http://majsterkowo.pl/forum/problem-z-p ... tml#p24922
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 9 lut 2016, 10:22

co do kalibracji i działania przycisku to udało mi się ogarnąć problemem jest tylko to by wciśnięcie przycisku powodowało wyzerowanie wagi.
czy jak dodam tą bibliotekę i dopiszę komendę #include<nowa biblioteka> to będę mógł użyć polecenia scale.tare
w taki sposób ?

if (digitalRead(4) == HIGH)
{
lcd.setCursor(0,0);
lcd.print("TAROWANIE");
lcd.setCursor(0,1);
scale.tare()

lcd.print(scale.getGram(),0);
delay(2000);
digitalWrite(7, HIGH);
}
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 9 lut 2016, 10:37

jeszcze jedno
chciałem zaopatrzyć się w taką klawiaturę (Klawiatura membranowa 4x3 samoprzylepna) zostało mi 8 gniazd cyfrowych i 2 analogowe dam radę to podłączyć ?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 9 lut 2016, 10:42

Nie zmieniaj na razie biblioteki, zobacz zamiast scale.tare() to

Kod: Zaznacz cały

  double odczyt = scale.averageValue(5);
  scale.setOffset(odczyt);
Starczy pinów dla klawiatury, taka co ma 12 przycisków potrzebuje 7 pinów, a ta co ma 16, to 8 pinów.
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 9 lut 2016, 12:08

kurcze dobry jesteś wygląda to tak i działa ":)

if (digitalRead(4) == HIGH)
{
lcd.setCursor(0,0);
lcd.print(" TAROWANIE ");
double odczyt = scale.averageValue(5);
scale.setOffset(odczyt);
lcd.setCursor(0,1);
lcd.print(" ");
delay(2000);
digitalWrite(7, HIGH);
}
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 9 lut 2016, 13:21

dzięki za pomoc
jak dotrze klawiatura to będę miał jeszcze kilka pytań ":)
dozownik prawie skończony ":)
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 11 lut 2016, 23:14

tak jak się spodziewałem mam kłopot z klawiaturą

klawiatura membranowa 4x3 7 pinów
podłączyłem ją od 13 do 7 pinu w arduino
zassałem bibliotekę kaypad
problem w tym że działa mi tylko cyfra 5

/* @file HelloKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact [email protected]
||
|| @description
|| | Demonstrates the simplest use of the matrix Keypad library.
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {7, 8, 9, 10}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {11, 12, 13}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
Serial.begin(9600);
}

void loop(){
char key = keypad.getKey();

if (key){
Serial.println(key);
}
}
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 12 lut 2016, 23:08

uszkodzona klawiatura zamówiłem drugą
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 19 lut 2016, 19:26

witam
próbuje napisać zależność ale mi nie wychodzi mianowicie chciałbym żeby po wciśnięciu klawisza # na klawiaturze membranowej wyświetlacz lcd wyświetlił tekst oraz wartośc do której ma odbywać się ważenie oraz bym mógł tą wartość zmieniać za pomocą cyfr na klawiaturze membranowej.


/*
* lcd
* VCC - > 5 V
* GND - GND
* SCL -> A5
* SDA -> A4
*/
/*
*wzmacniacz
*VCC - 3,3V
*GND - GND
*SCK - A0
*DT - A1
*/

#include <hx711.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //adres i zdefiniowane piny lcd
Hx711 scale(A1, A0); //zdefiniowane piny tensometru
const byte ROWS = 4; //cztery wiersze
const byte COLS = 3; //trzy kolumny
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {13,12,11,10}; //piny wierszy
byte colPins[COLS] = {9,8,7}; //piny kolumn

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//pin 2 = stop ważenie
//pin 3 = stop zgrubne start precyzja
int stop_waga = 2; //deklaracja pinu
int precyzyjne = 3; //deklaracja pinu

void setup() { //co będzie użyte w programie

lcd.begin(16, 2);

pinMode(stop_waga ,OUTPUT);
pinMode(precyzyjne ,OUTPUT);

lcd.backlight(); // zalaczenie podwietlenia
lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)

lcd.print(" DOZOWNIK");

lcd.setCursor(0,1); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print(" MAX 5 KG");
delay(5000);

}
void loop() { //główny program

char key = keypad.getKey();
if (key == '0') // tarowanie
{
lcd.setCursor(0,0);
lcd.print(" TAROWANIE ");
double odczyt = scale.averageValue(5);
scale.setOffset(odczyt);
lcd.setCursor(0,1);
lcd.print(" ");
delay(1000);
}
if(scale.getGram() >= 500){ //zadana waga w gramach
digitalWrite(stop_waga ,HIGH); //jak uzyskasz zadaną wysteruj 2
}
else{
digitalWrite(stop_waga ,LOW); //jak nie ma zadanej wygaś 2
}
if(scale.getGram() <= 400){
digitalWrite(precyzyjne ,HIGH);

}
else{
digitalWrite (precyzyjne ,LOW);
}
lcd.setCursor(0, 0); //ustawienie kursora
lcd.print("AKTUALNA ");
lcd.print(scale.getGram(),0); //ile miejsc po przecinku skala wagi
lcd.println(" G ");
lcd.setCursor(0, 1);
delay(200);


lcd.println("ZADANA ");


}
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 19 lut 2016, 21:51

stiven
proszę o pomoc ":)
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Tensometr i arduino

Post autor: stiven » 20 lut 2016, 22:33

Napisałem, nie wiem czy będzie działać, bo nie mam jak sprawdzić. Wartość maksymalnie czterocyfrowa. Wejście w ustawienie przez wciśnięcie # i wyjście też. Ostatni kod, więcej nie będę pisał.
Spoiler:
andrzej
Młodszy majsterkowicz
Posty: 22
Rejestracja: 3 lut 2016, 22:16

Re: Tensometr i arduino

Post autor: andrzej » 20 lut 2016, 23:11

siema stiven
wiem że możesz mieć już dosyć uczenia żółtodziobów za wszystkie wskazówki dzięki bardzo żeby nie twoje porady to kiepsko by było z moim projektem.
co do tego co dopisałeś do kodu to wywala mi takie błędy ;

test_wagi.ino:115:6: error: expected ';' before 'if'
test_wagi.ino:147:1: error: expected '}' at end of input
test_wagi.ino:147:1: error: expected '}' at end of input
test_wagi.ino:147:1: error: expected '}' at end of input
Błąd kompilacji.

poradź co poprawić proszę
ODPOWIEDZ

Strony partnerskie: