Karolyeti Napisano Grudzień 2, 2022 Udostępnij Napisano Grudzień 2, 2022 (edytowany) Witam Mam pytanie czy jest jakaś możliwość podłączenia 4 czujników przepływu (water flow sensor yf-s401) do arduino nano nie używając arduino mega ? Sensor ten opiera się na czujniku Halla i do transmisji sygnału wykorzystuje przerwania. Problem w tym że arduino które posiadam mają tylko dwa piny obsługujące te przerwania (pin 2 i 3) . Czy jest może możliwość obsługi tych czujników przez arduino nano i np.funkcję pinchange? jeżeli tak to byłbym wdzięczy za przykład z zainicjowaniem dodatkowych 2 czujników. Kod na którym obecnie się opieram to byte sensorInterrupt_1 = 0; // 0 = digital pin 2 byte sensorPin_1 = 2; float calibrationFactor_1 = 5.5; volatile byte pulseCount_1; byte pulseCount1;//protected transfer float flowRate_1; unsigned int flowMilliLitres_1; unsigned long totalMilliLitres_1; unsigned long totalLitres_1; //For FlowSensor_2 Ble byte sensorInterrupt_2 = 1; // 1 = digital pin 3 byte sensorPin_2 = 3; //float calibrationFactor_2 = 5.44; float calibrationFactor_2 = 6.44; volatile byte pulseCount_2; byte pulseCount2;//protected transfer float flowRate_2; unsigned int flowMilliLitres_2; unsigned long totalMilliLitres_2; unsigned long totalLitres_2; //sensor reading and print timing unsigned long readInterval = 1000; unsigned long lastRead; void setup() { Serial.begin(115200); //Setup_FlowSensor_1 pinMode(sensorPin_1, INPUT); digitalWrite(sensorPin_1, HIGH); pulseCount_1 = 0; flowRate_1 = 0.0; flowMilliLitres_1 = 0; totalMilliLitres_1 = 0; totalLitres_1 = 0; attachInterrupt(sensorInterrupt_1, pulseCounter_1, FALLING); //Setup_FlowSensor_2 pinMode(sensorPin_2, INPUT); digitalWrite(sensorPin_2, HIGH); pulseCount_2 = 0; flowRate_2 = 0.0; flowMilliLitres_2 = 0; totalMilliLitres_2 = 0; totalLitres_2 = 0; attachInterrupt(sensorInterrupt_2, pulseCounter_2, FALLING); } void flowSensors() { if ((millis() - lastRead) > readInterval) // process counters once per second { lastRead += readInterval; noInterrupts(); pulseCount1 = pulseCount_1; pulseCount_1 = 0; pulseCount2 = pulseCount_2; pulseCount_2 = 0; interrupts(); flowRate_1 = (pulseCount1) / calibrationFactor_1; flowRate_2 = (pulseCount2) / calibrationFactor_2; flowMilliLitres_1 = (flowRate_1 / 60) * 1000; totalMilliLitres_1 += flowMilliLitres_1; totalLitres_1 = (totalMilliLitres_1 / 1000); flowMilliLitres_2 = (flowRate_2 / 60) * 1000; totalMilliLitres_2 += flowMilliLitres_2; totalLitres_2 = (totalMilliLitres_2 / 1000); Serial.print("FlowRate_1= "); Serial.print(flowRate_1); Serial.print(" Total_1= "); Serial.println(totalLitres_1); Serial.println(" "); //pulseCount_1 = 0; Serial.print("FlowRate_2= "); Serial.print(flowRate_2); Serial.print(" Total_2= "); Serial.println(totalLitres_2); Serial.println(" "); //pulseCount_2 = 0; } } void pulseCounter_1() { pulseCount_1++; } void pulseCounter_2() { pulseCount_2++; } void loop() { flowSensors(); } Edytowano Grudzień 2, 2022 przez Karolyeti Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Grudzień 2, 2022 Udostępnij Grudzień 2, 2022 Oprócz przerwań zewnętrznych masz jeszcze do dyspozycji przerwania pcint, które są dostępne na większości pinów...(jest gotowa biblioteka do ich obsługi tak że luz) druga sprawa to taka że w większości przypadków kod wykonuje się tak szybko że najzwyczajniej nie potrzebujesz przerwań używać...powiedz coś więcej o tych czujnikach (max częstotliwości sygnałów) to wtedy będzie prościej doradzić...i ten kod wklej do "wstaw kod programu" 1 Cytuj Link do komentarza Share on other sites More sharing options...
Karolyeti Grudzień 2, 2022 Autor tematu Udostępnij Grudzień 2, 2022 To ten czujnik https://github.com/microrobotics/YF-S401/blob/main/YF_S401_datasheet.pdf Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Grudzień 2, 2022 Udostępnij Grudzień 2, 2022 Z tego co piszą to na przepływ 1 litra jest 5880 impulsów...strasznie dużo 🤔 więc raczej przerwania będą potrzebne...biblioteka pierwsza z brzegu wraz z przykładami... https://github.com/NicoHood/PinChangeInterrupt Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Karolyeti Grudzień 2, 2022 Autor tematu Udostępnij Grudzień 2, 2022 Studiowałem tą bibliotekę ale mam problem bo nie umiem zaimplementować tej funkcji żeby otrzymać poprawy wynik z innych pinów niż 2 i 3 😞 Cytuj Link do komentarza Share on other sites More sharing options...
Belferek Grudzień 2, 2022 Udostępnij Grudzień 2, 2022 Może ten artykuł się przyda - zobacz. Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Grudzień 2, 2022 Udostępnij Grudzień 2, 2022 19 minut temu, Karolyeti napisał: Studiowałem tą bibliotekę ale mam problem bo nie umiem zaimplementować tej funkcji żeby otrzymać poprawy wynik z innych pinów niż 2 i 3 😞 Podajesz tylko nr pinu, funkcję która ma się wykonać po wykryciu stanu , no i oczywiście stan który ma wywołać przerwanie.. Cytuj Link do komentarza Share on other sites More sharing options...
Karolyeti Grudzień 2, 2022 Autor tematu Udostępnij Grudzień 2, 2022 #include "PinChangeInterrupt.h" #define INTERRUPT_PIN 5; int flowPin = 5; double flowRate; volatile int count; void setup() { Serial.begin(9600); pinMode(flowPin, INPUT); attachPinChangeInterrupt(digitalPinToChangeInterrupt(5),Flow, CHANGE); } void loop() { count = 0; interrupsts; delay (1000); noInterrupts(); flowRate = flowRate *60; flowrate = flowRate / 1000; Serial.println (flowRate); } void Flow() { count++ } Czy ten kod obsłuży pin 5 jako przerwanie ? Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Grudzień 2, 2022 Udostępnij Grudzień 2, 2022 1 godzinę temu, Karolyeti napisał: #include "PinChangeInterrupt.h" #define INTERRUPT_PIN 5; int flowPin = 5; double flowRate; volatile int count; void setup() { Serial.begin(9600); pinMode(flowPin, INPUT); attachPinChangeInterrupt(digitalPinToChangeInterrupt(5),Flow, CHANGE); } void loop() { count = 0; interrupsts; delay (1000); noInterrupts(); flowRate = flowRate *60; flowrate = flowRate / 1000; Serial.println (flowRate); } void Flow() { count++ } Czy ten kod obsłuży pin 5 jako przerwanie ? No powinien..o ile jest poprawny😉 bo na githubie na głównej stronie biblioteki jest szkic z inną funkcja "attach"...no ale to nie problem sprawdzić...podłącz jakiś guzik na szybko i napisz funkcję która będzie zapalać LED i się wyjaśni.. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!