09-10-2023, 18:08
Witam.
Buduję projekt termometru bazującego na czujnikach DS18B20 przy tym wykorzytując moduł bluetooth xm15b do komunikacji z telefonem a dokładniej virtuino. Sam program w takiej konfiguracji działa dobrze jednak chcę dołożyć obsługę wyświetlacza oled SH1106 z komunikacją i2C. Po złożeniu kodu dla obsługi samego wyświetlacza i zczytywaniu danych z czujników ta część programu również działa dobrze. Problem mój zaczyna się w momencie sklejenia tych dwóch części programu do kupy, moja wiedza jest początkująca w zakresie programowania ale z tego co zauważyłem program gubi się przy inicjalizacji ekranu. wrzucę 3 kody pierwszy to kod obsługujący temperaturę bluetooth i virtuino, drugi obługuje temperaturę i oled a trzeci to złożenie obu do kupy.
kod nr 2:
i kod sklejany (skróciłem go do obsługi jednego czujnika dla czytelności:
Jak ktoś mógłby cos podpowiedzieć będę wdzięczny, póki co jestem świeży w tym temacie i sporo korzystam z gotowców dostosowując je pod siebie, ale od kilku dni z tym walcze i już kończą się pomysły, gdzieś na forum angielskim znalazłem coś że chodzi o pin resetu w arduino jednak nie bardzo mi idzie znalezienie informacji co z tym mogę zrobić, a może arduino uno jest nie wystarczające?
pozdrawiam i z góry dzięki za fatygę.
Buduję projekt termometru bazującego na czujnikach DS18B20 przy tym wykorzytując moduł bluetooth xm15b do komunikacji z telefonem a dokładniej virtuino. Sam program w takiej konfiguracji działa dobrze jednak chcę dołożyć obsługę wyświetlacza oled SH1106 z komunikacją i2C. Po złożeniu kodu dla obsługi samego wyświetlacza i zczytywaniu danych z czujników ta część programu również działa dobrze. Problem mój zaczyna się w momencie sklejenia tych dwóch części programu do kupy, moja wiedza jest początkująca w zakresie programowania ale z tego co zauważyłem program gubi się przy inicjalizacji ekranu. wrzucę 3 kody pierwszy to kod obsługujący temperaturę bluetooth i virtuino, drugi obługuje temperaturę i oled a trzeci to złożenie obu do kupy.
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include "VirtuinoBluetooth.h"
#include <SoftwareSerial.h>
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
SoftwareSerial bluetoothSerial = SoftwareSerial(2,3);
VirtuinoBluetooth virtuino(bluetoothSerial);
//======================================================================== setup
void setup(void){
Serial.begin(9600);
bluetoothSerial.begin(9600);
virtuino.DEBUG=true;
sensors.begin();
Serial.println("Setup complete.");
}
//======================================================================== setup
void readTemperatures(){
Serial.println(" Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
float temperature1=sensors.getTempCByIndex(0);
float temperature2=sensors.getTempCByIndex(1);
float temperature3=sensors.getTempCByIndex(2);
float temperature4=sensors.getTempCByIndex(3);
float temperature5=sensors.getTempCByIndex(4);
float temperature6=sensors.getTempCByIndex(5);
float temperature7=sensors.getTempCByIndex(6);
Serial.println("Temperature for Device 1 is: "+String(temperature1));
Serial.println("Temperature for Device 2 is: "+String(temperature2));
Serial.println("Temperature for Device 3 is: "+String(temperature3));
Serial.println("Temperature for Device 4 is: "+String(temperature4));
Serial.println("Temperature for Device 5 is: "+String(temperature5));
Serial.println("Temperature for Device 6 is: "+String(temperature6));
Serial.println("Temperature for Device 7 is: "+String(temperature7));
virtuino.vMemoryWrite(0,temperature1);
virtuino.vMemoryWrite(1,temperature2);
virtuino.vMemoryWrite(2,temperature3);
virtuino.vMemoryWrite(3,temperature4);
virtuino.vMemoryWrite(4,temperature5);
virtuino.vMemoryWrite(5,temperature6);
virtuino.vMemoryWrite(6,temperature7);
}
void loop(void){
virtuino.run();
readTemperatures();
virtuino.vDelay(1000);
}
Kod:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <OneWire.h>
#include <DallasTemperature.h>
/* Uncomment the initialize the I2C address , uncomment only one, If you get a totally blank screen try the other*/
#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // QT-PY / XIAO
#define ONE_WIRE_BUS 6
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
// Show image buffer on the display hardware.
// Since the buffer is intialized with an Adafruit splashscreen
// internally, this will display the splashscreen.
delay(250); // wait for the OLED to power up
display.begin(i2c_Address, true); // Address 0x3C default
//display.setContrast (0); // dim display
display.display();
delay(2000);
// Clear the buffer.
display.clearDisplay();
}
void loop() {
Serial.println(" Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
float temperature1 = sensors.getTempCByIndex(0);
float temperature2 = sensors.getTempCByIndex(1);
float temperature3 = sensors.getTempCByIndex(2);
float temperature4 = sensors.getTempCByIndex(3);
float temperature5 = sensors.getTempCByIndex(4);
float temperature6 = sensors.getTempCByIndex(5);
float temperature7 = sensors.getTempCByIndex(6);
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(25, 0);
display.println("Termometr PRO");
display.setTextColor(SH110X_WHITE);
display.print("Tk=");
display.print(temperature1);
display.print(", T10=");
display.println(temperature2);
display.print("T1/2=");
display.println(temperature3);
display.print("Twej=");
display.print(temperature4);
display.print(", Twyj");
display.println(temperature5);
display.print("T_gl=");
display.print(temperature6);
display.display();
display.clearDisplay();
}
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include "VirtuinoBluetooth.h"
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#define ONE_WIRE_BUS 6
/* Uncomment the initialize the I2C address , uncomment only one, If you get a totally blank screen try the other*/
#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
SoftwareSerial bluetoothSerial = SoftwareSerial(2,3);
VirtuinoBluetooth virtuino(bluetoothSerial);
//======================================================================== setup
void setup(){
Serial.begin(9600);
bluetoothSerial.begin(9600);
virtuino.DEBUG=true;
sensors.begin();
Serial.println("Setup complete.");
// Show image buffer on the display hardware.
// Since the buffer is intialized with an Adafruit splashscreen
// internally, this will display the splashscreen.
delay(1500); // wait for the OLED to power up
display.begin(i2c_Address, true); // Address 0x3C default
//display.setContrast (0); // dim display
display.display();
delay(2000);
// Clear the buffer.
display.clearDisplay();
}
//======================================================================== setup
void readTemperatures(){
Serial.println(" Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
float temperature1=sensors.getTempCByIndex(0);
Serial.println("Temperature for Device 1 is: "+String(temperature1));
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(25, 0);
display.println("Termometr PRO");
display.setTextColor(SH110X_WHITE);
display.print("Tk=");
display.print(temperature1);
virtuino.vMemoryWrite(0,temperature1);
}
void loop(){
virtuino.run();
readTemperatures();
virtuino.vDelay(1000);
}
pozdrawiam i z góry dzięki za fatygę.