• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Skarbonka z Arduino?
#1
Buduję powoli "skarbonkę", która dzieli od razu monety na nominały.
Pomyślałem, że skoro jest już podział na nominały, to może warto byłoby od razu policzyć ile pieniędzy jest w środku.

Mamy 10 różnych rodzajów monet do policzenia, tj. 1,2,5 gr; 10,20,50 gr; 1,2,5 zł + "nowe" 2 złote - te większe okolicznościowe.

Liczenie monet miałoby odbywać się za pomocą TCRT5000 (jeden czujnik na każdy rodzaj monety - łącznie 10)
Do tego wyświetlacz LED 8 cyfr, 7 segmentów z MAX7219

Pytanie jest następujące:
Co jeszcze będę potrzebował?

1x https://abc-rc.pl/product-pol-12737-NANO...duino.html
10x https://abc-rc.pl/product-pol-9206-Czujn...szkod.html
1x https://abc-rc.pl/product-pol-7535-Wyswi...X7219.html
 
Odpowiedź
#2
Będąc w pracy (bardzo ciężka praca, gdzie 95% czasu oglądam "jutuby" lub śpię - I PŁACĄ MI ZA TO) napisałem na tablecie kod (nie mając przy sobie ani Arduino, ani Arduino IDE).

Niestety nie jestem pewien, czy kod ten jest prawidłowy.
Założenie jest takie, że na pinach 2-11 miałyby być podłączone sensory TCRT5000, na linie 13 wyjście na wyświetlacz 7-segmentowy.

Kod jaki mi wyszedł brzmi:
Kod:
/* definiowanie pinów czujników */
const int pin1gr = 2;
const int pin2gr = 3;
const int pin5gr = 4;
const int pin10gr = 5;
const int pin20gr= 6;
const int pin50gr= 7;
const int pin100gr= 8;
const int pin200gr = 9;
const int pin200gr2 = 10;
const int pin500gr = 11;

/* resetowanie czujników */
int IR1 = 0;
int IR2 = 0;
int IR5 = 0;
int IR10 = 0;
int IR20 = 0;
int IR50 = 0;
int IR100 = 0;
int IR200 = 0;
int IR2002 = 0;
int IR500 = 0;

int liczbaMonet = 0;  // liczba wszystkich monet wrzuconych
int kwota = 0; // kwota w skarbonce w groszach

/* Display */
/* Include the HCMAX7219 and SPI library */
#include <HCMAX7219.h>
#include "SPI.h"
/* Set the LOAD (CS) digital pin number*/
#define LOAD 13
/* Create somewhere to store the message*/
String message = "BEEF";
/* Create an instance of the library */
HCMAX7219 HCMAX7219(LOAD);

void setup() {
  Serial.begin(9600);
  /* ustawienie pinów, na których są czujniki na odczyt */
  pinMode(pin1gr,INPUT);
  pinMode(pin2gr,INPUT);
  pinMode(pin5gr,INPUT);
  pinMode(pin10gr,INPUT);
  pinMode(pin20gr,INPUT);
  pinMode(pin50gr,INPUT);
  pinMode(pin100gr,INPUT);
  pinMode(pin200gr,INPUT);
  pinMode(pin200gr2,INPUT);
  pinMode(pin500gr,INPUT);

  //Welcome message
  byte Loopcounter;
  byte Position;
}

void loop() {
  /* odczyt z czujników */
  IR1 = digitalRead(pin1gr);
  IR2 = digitalRead(pin2gr);
  IR5= digitalRead(pin5gr);
  IR10 = digitalRead(pin10gr);
  IR20 = digitalRead(pin20gr);
  IR50= digitalRead(pin50gr);
  IR100 = digitalRead(pin100gr);
  IR200 = digitalRead(pin200gr);
  IR2002 = digitalRead(pin200gr2);
  IR500 = digitalRead(pin500gr);
  
   if (IR1 == 0) {
    wykrytoMonete(1);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR2 == 0) {
    wykrytoMonete(2);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR5 == 0) {
    wykrytoMonete(5);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR10 == 0) {
    wykrytoMonete(10);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR20 == 0) {
    wykrytoMonete(20);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR50 == 0) {
    wykrytoMonete(50);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR100 == 0) {
    wykrytoMonete(100);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }

   if (IR200 == 0) {
    wykrytoMonete(200);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR2002 == 0) {
    wykrytoMonete(200);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }
  
   if (IR500 == 0) {
    wykrytoMonete(500);
    kwotaSerial();
    kwotaWyswietlacz();
    delay(200);
   }

}

/* funkcja wyświetlająca kwotę na wyświetlaczu 7-segmentowym 8-polowym */
void kwotaWyswietlacz() {
   HCMAX7219.Clear();
   
    if (kwota > 9999){
      HCMAX7219.print7Seg(kwota,4);
    } else if(kwota > 999){
      HCMAX7219.print7Seg(kwota,3);
    } else if (kwota > 99){
      HCMAX7219.print7Seg(kwota,2);
    } else if (kwota > 9){
      HCMAX7219.print7Seg("0".kwota,2);
    } else {
      HCMAX7219.print7Seg("00".kwota,2);
    }
   
    HCMAX7219.Refresh();
}

/* funkcja wysyłająca informacje o aktualnej liczbie monet i kwocie przez serial */
void kwotaSerial(){
    Serial.print("Liczba monet w skarbonce: ".liczbaMonet);
    Serial.println("Aktualnie w skarbonce jest ".(kwota/100)." zł.");
}

/* funkcja licząca aktualny stan kasy w skarbonce */
void wykrytoMonete(int nominal) {
    Serial.println("Wykryto monetę ".(nominal/100)." zł");
    kwota = kwota + nominal;
    liczbaMonet ++;
}

Czy macie może jakieś sugestie odnośnie mojego kodu?
 
Odpowiedź
#3
Teoretycznie, to ten kod może być poprawny.
Ja bym go napisał inaczej, ale to kwestia gustu i zamiłowania do niekomplikowania sobie życia.
Wyprzedzając Twoje pytania na temat komplikacji życia, poczytaj trochę o strukturach danych.
Bardzo dobrym pomysłem było by zapisywanie tego w EEPROM, bo jak wyłączysz zasilanie, to Ardu zapomni ile ma kasy w skarbonce.
Albo przełączanie się w tryb uśpienia, bo przecież sprzęt nie będzie cały czas włączony czekając na wrzutkę.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
Hej. Chciałbym powrócić do tematu "inteligentnej skarbonki".

Teoretycznie wszystkie komponenty są złożone, ale niestety nie chce mi to działać... Mógłby mnie ktoś naprowadzić, co robię źle?

Hardware skarbonki to:
1x NodeMCU v3 CH340
https://abc-rc.pl/pl/products/modul-wifi...-7348.html

10x Czujnik odbiciowy TCRT5000
https://abc-rc.pl/pl/products/czujnik-od...-9206.html

3x MODUŁ ZASILANIA AMS1117 DC-DC 3,3V 0,8A
https://sklep.msalamon.pl/produkt/modul-...c-33v-08a/

1x PCF8575 EKSPANDER PORTÓW I/O 16-KANAŁÓW
https://sklep.msalamon.pl/produkt/pcf857...6-kanalow/

Software na razie taki:
Kod:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <LedControl.h>
#include <PCF8575.h>

PCF8575 PCF(0x20);
LedControl lc=LedControl(D5,D6,D7,1);

const char* ssid = "Nazwa Sieci";
const char* password = "SuperTrudneHasło";

unsigned long lastTime = 0;
unsigned long timerDelay = 1000;

int m1gr = 0;
int m2gr = 0;
int m5gr = 0;
int m10gr = 0;
int m20gr = 0;
int m50gr = 0;
int m100gr = 0;
int m200gr = 0;
int m500gr = 0;

int statusik = 1;
bool kropka = true;

void setup(){
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Wire.begin();
  lc.shutdown(0,false);
  lc.setIntensity(0,8);
  lc.clearDisplay(0);
  lc.setChar(0,0,' ',true);
  lc.setChar(0,1,' ',true);
  lc.setChar(0,2,' ',true);
  lc.setChar(0,3,'0',true);
  lc.setChar(0,4,'L',false);
  lc.setChar(0,5,'L',false);
  lc.setChar(0,6,'E',false);
  lc.setChar(0,7,'H',false);
  Serial.println(" ");
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print("*");
    lc.setChar(0,0,' ',kropka);
    kropka = !kropka;
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
  if (!PCF.begin()){
    Serial.println("could not initialize...");
  }
  if(!PCF.isConnected()){
    Serial.println("=> not connected");
  }else{
    Serial.println("=> connected!!");
  }
}

void loop(){
   if((millis() - lastTime) > timerDelay) {
    lc.clearDisplay(0);
    m1gr = PCF.read(5);
    m2gr = PCF.read(6);
    m5gr = PCF.read(7);
    m10gr = PCF.read(8);
    m20gr = PCF.read(9);
    m50gr = PCF.read(10);
    m100gr = PCF.read(11);
    m200gr = PCF.read(12);
    m500gr = PCF.read(13);

    if(m1gr==statusik){
      Serial.println("Wykryta moneta 1gr");
      lc.setChar(0,0,'1',false);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,2,'0',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m2gr==statusik){
      Serial.println("Wykryta moneta 2gr");
      lc.setChar(0,0,'2',false);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,2,'0',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m5gr==statusik){
      Serial.println("Wykryta moneta 5gr");
      lc.setChar(0,0,'5',false);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,2,'0',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m10gr==statusik){
      Serial.println("Wykryta moneta 10gr");
      lc.setChar(0,0,'0',false);
      lc.setChar(0,1,'1',false);
      lc.setChar(0,2,'0',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m20gr==statusik){
      Serial.println("Wykryta moneta 20gr");
      lc.setChar(0,0,'0',false);
      lc.setChar(0,1,'2',false);
      lc.setChar(0,2,'0',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m50gr==statusik){                            
      Serial.println("Wykryta moneta 50gr");
      lc.setChar(0,0,'0',false);
      lc.setChar(0,1,'5',false);
      lc.setChar(0,2,'0',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m100gr==statusik){
      Serial.println("Wykryta moneta 1zl");
      lc.setChar(0,0,'0',false);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,2,'1',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m200gr==statusik){
      Serial.println("Wykryta moneta 2zl");
      lc.setChar(0,0,'0',false);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,2,'2',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    if(m500gr==statusik){
      Serial.println("Wykryta moneta 5zl");
      lc.setChar(0,0,'0',false);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,2,'5',true);
      lc.setChar(0,3,' ',false);
      lc.setChar(0,4,' ',false);
      lc.setChar(0,5,' ',false);
      lc.setChar(0,6,' ',false);
      lc.setChar(0,7,' ',false);
    }
    Serial.println("");
    lastTime = millis();
   }
}

Schemat połączenia komponentów:
   

Niestety problem jest następujący...
Gdy mam podłączone wyjścia z czujników do expandera portów, to expander mi wywala co chwilę, tj. łączy się i rozłącza, albo wcale nie łączy, a gdy wyjścia z czujników nie są podłączone do expandera, to expander łączy się normalnie i nie rozłącza go...

Pytanie brzmi:
Co zwaliłem, czego zapomniałem?
 
Odpowiedź
#5
Po co Ci tyle modułów zasilających? Jak 1 nie wystarczy, to i tak nawet jednego nie powinieneś podłączać, skoro 1 ma max 0.8A, płytkę programujesz z USB komputera, nie przekraczaj 0.5 A. Choć powinno być w sumie dla tych czujników tylko 10x20mA, jeden moduł powinien wystarczyć..
W opisie modułu expandera masz podane zasilanie 5V, logika 3.3V, tak że nie możesz go zasilać z 3.3V. Oczywiście sprawdziłbym to multimetrem, zdarzają się błędy w opisach, ale na płytce widać jakiś scalak przypominający regulator napięcia. No i sprawdziłbym rezystory podciągające dla I2C, dla 3.3V powinny być mniejsze wartości niż na typowych modułach arduinowych 5V.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
(17-12-2023, 22:07)kaczakat napisał(a): Po co Ci tyle modułów zasilających?

Podzieliłem zasilanie sensorów na 3 moduły, gdyż jak podłączałem wszystkie na jeden moduł, to przy jednoczesnym "złapaniu" 6 lub więcej sensorów na raz - AMS1117 będący na pokładzie modułu zasilania puszczał dymek i tyle było...

(17-12-2023, 22:07)kaczakat napisał(a): W opisie modułu expandera masz podane zasilanie 5V, logika 3.3V, tak że nie możesz go zasilać z 3.3V.

Expander jest wyposażony w układ AMS1117 3.3V i wg opisu powinien być zasilony 5V, ale wg instrukcji od przyjaciół z Chin może być też zasilony 3.3V, mimo iż opis w/w układu mówi, że powinien być zasilony z minimum 4.75V

(17-12-2023, 22:07)kaczakat napisał(a): Oczywiście sprawdziłbym to multimetrem, zdarzają się błędy w opisach

Sprawdziłem, ale swoje lutowanie i okazało się, że problem z rozłączaniem expandera był spowodowany niepoprawnym przylutowaniem przewodu zasilającego expander Smile
 
Odpowiedź
#7
Faktycznie te ścieżki na fotce w sklepie tak wyglądają, jakbyś z VCC pomijał stabilizator i zasilał wprost PCF.
Jak moduł zasilający się upalił przy skokowym obciążeniu to może lepiej dołożyć jakiś elektrolit niż trzy moduły, przecież to szarpnięcie prądu dalej tam się pojawia, tylko zostało przeniesione na pin Vu. Jest to w sumie bardzo dziwna sytuacja, że 10 led czy tam cały moduł z tymi ledami, po 20mA MAX każdy, upaliły 0.8A stabilizator, który powinien mieć zabezpieczenie przed przegrzaniem i inne zabezpieczenia, chyba że to jakaś "uproszczona" wersja z Ali.
Przy zasilaniu z 5V nie powinien się nawet za bardzo grzać przy 200mA chwilowego obciążenia, chyba że zasilasz go z 12V.
Inna opcja to użyć przetwornicy, straty na liniowych są proporcjonalne do mocy i różnicy napięć, jak to nie będzie wisieć na zasilaczu to trzeba i tak jakoś rozłączać zasilanie tych elementów zasilających.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#8
W sumie, to upaliłem 2 moduły zasilające "2w1" a nawet w zasadzie "3w1", bo miał 3 różne napięcia, tj. 3,3V, 5V i napięcie podawane przez zasilacz, czyli w moim przypadku było to 12V...
https://abc-rc.pl/pl/products/zasilacz-s...-7667.html

Z czystej ciekawości wziąłem sobie odlutowałem 2 z 3 stabilizatorów i z tego trzeciego co został podłączyłem wszystkie 10 modułów z sensorami i próbowałem ten stabilizator upalić (załączając wszystkie 10 czujników na raz), dalej zasilając go z VU na nodeMCU...
Okazało się, że nie dość, że nie udało mi się go zajarać tak, jak zjarały mi się te stabilizatory z w/w linku, to jeszcze bez problemu uciągnął ekspander...
 
Odpowiedź
#9
Z 12V to raczej przetwornica, nadmiar napięcie idzie w ciepło 0.2A x (12-3.3)= 1.74W, bez radiatora się przegrzeje. Ale i tak wg Datasheet ma zabezpieczenie termiczne, więc jeszcze była to jakaś podróbka.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości