Hacka en automat att släppa burkar med SMS (4 / 6 steg)
Steg 4: Aktivera motorerna och läsa shute sensorn
Först, vårt mål är att aktivera en motorisk varje gång slumpmässigt och gå till nästa motorn om sensorn inte upptäcker alla kan. Det kommer att prova för 8 gånger (två gånger för varje kolumn).
För att göra det, måste du först markera en kolumn och att göra det enkelt vi lagrade PIN-koden för varje kolumn i en matris. För att göra slumpmässiga kommando fungerar måste bra du läsa några buller och generera utsädet. Så får vi analogRead från A0 (som inte är ansluten till något). Eftersom våra reläer använda låg till aktivera, satt vi alla i hög.
int reläer [4] {22, 24, 26, 28};
void setup() {
randomSeed(analogRead(0));
för (int jag = 0; jag < 4; i ++) {
pinMode (reläer [i], produktionen);
digitalWrite (relär [i], hög);
}
}
Nu har du din reläer set och redo att aktiveras. Låt oss kolla hur du aktiverar en och kolla sensorn.
Blanda motor och läsa sensorn
#define THRESHOULD_SENSOR 100
#define ROLLING_TIME 3000
#define NUMBER_OF_TRIES 8
(...)
booleska bateu() {
int i = analogRead(A7);
Serial.Print ("en"); Serial.println(in);
Delay(10);
avkastning på > = THRESHOULD_SENSOR;
}
booleska activateRelays() {
int tentativas = 0;
Boolean släppt = false;
int current_release_millis;
int relay_idx = random (0, 3);
medan (! släppt & & tentativas < NUMBER_OF_TRIES) {
tentativas ++;
digitalWrite (relär [relay_idx], låg);
current_release_millis = millis();
int delay_time = millis() - current_release_millis;
medan (delay_time < = ROLLING_TIME) {
delay_time = millis() - current_relase_millis;
om (bateu()) {
släppt = sant;
bryta;
}
}
digitalWrite (relär [relay_idx], hög);
om (relay_idx == 3) {
relay_idx = 0;
} annat {
relay_idx ++;
}
}
återvändande släppt;
}
Redo att gå! Om du ringer funktionen activateRelays() borde den returnera om kan släpptes eller inte. Och försök att göra det för 8 gånger.
Vi satt en konstant THRESHOULD_SENSOR vara våra parameter att kontrollera om kan slå botten av maskinen, om du använder en enkel piezo, värdet bör vara mer än 400. Men våra tester värdet 100 fungerar bra.
ROLLING_TIME konstanten definierar tiden motorn bör hållas på innan ändringen till andra ou sluta med den.