05-04-2020, 11:54
Witajcie!
Do mojego projektu muszę skomunikować NodeMCU v3 oraz ProMini za pomocą szyny i2c. Teoria jest całkiem jasna i zrozumiała, ale... nie działa tak jak należy, w zasadzie, nie działa wcale.
Kiedy robię zwykłą komunikację i2c typu master -> slave, wszystko jest super. Jednak kiedy master requestuje slave już tak fajnie nie jest. Zastanawiam się, czy to ja popełniam błąd w kodzie, czy to jednak jakaś inna przyczyna. Robiłem testy z rezystorami podciągającymi oraz bez i nie przynosi to rezultatów. Dystans między urządzeniami to ok. 15 cm, docelowo będzie ok. 6-8m.
Czy możecie spojrzeć w mój kod i stwierdzić, czy są tam jakieś rażące błędy?
Master
Slave
Z góry dzięki za pomoc!
K.
Do mojego projektu muszę skomunikować NodeMCU v3 oraz ProMini za pomocą szyny i2c. Teoria jest całkiem jasna i zrozumiała, ale... nie działa tak jak należy, w zasadzie, nie działa wcale.
Kiedy robię zwykłą komunikację i2c typu master -> slave, wszystko jest super. Jednak kiedy master requestuje slave już tak fajnie nie jest. Zastanawiam się, czy to ja popełniam błąd w kodzie, czy to jednak jakaś inna przyczyna. Robiłem testy z rezystorami podciągającymi oraz bez i nie przynosi to rezultatów. Dystans między urządzeniami to ok. 15 cm, docelowo będzie ok. 6-8m.
Czy możecie spojrzeć w mój kod i stwierdzić, czy są tam jakieś rażące błędy?
Master
Kod:
#include <Wire.h>
#include <RBD_Timer.h>
RBD::Timer timer_1(2500);
int x;
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("Connected to serial port.");
pinMode(LED_BUILTIN, OUTPUT);
}
void blysk() {
digitalWrite(LED_BUILTIN, LOW);
delay(20);
digitalWrite(LED_BUILTIN, HIGH);
delay(10);
}
void loop() {
if (timer_1.isExpired()) {
Wire.requestFrom(8, 1);
Serial.println("Wysłano request i2c.");
x = Wire.read();
if (x > -1) {
Serial.print("Odebrano wartość: ");
Serial.println(x);
}
blysk();
timer_1.restart();
}
Slave
Kod:
#include <Wire.h>
int pom, percent;
const int AirValue = 670; //663 -> w powietrzu
const int WaterValue = 140; //310 -> w wodzie
void setup() {
Wire.begin(8);
Serial.begin(115200);
Serial.println("Connected to serial port.");
Wire.onRequest(requestEvent);
pinMode(LED_BUILTIN, OUTPUT);
}
void blysk() {
digitalWrite(LED_BUILTIN, LOW);
delay(200);
digitalWrite(LED_BUILTIN, HIGH);
delay(10);
}
void requestEvent() {
pom = analogRead(A0);
percent = map(pom,AirValue,WaterValue,0,100);;
Wire.write(percent);
Serial.print("Wysłano odpowiedź i2c: ");
Serial.println(percent);
blysk();
}
void loop() {
}
Z góry dzięki za pomoc!
K.