Tester pH

User avatar
maffiu
Posts: 487
Joined: Wed Nov 30, 2016 9:30 pm
Location: Kraków/Skawina

Sat Jun 15, 2019 8:38 pm

Ktoś może testował tester pH tego typu ?

https://s.click.aliexpress.com/e/2lqFq5Ba7
User avatar
QLQ
Posts: 802
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Sun Jun 16, 2019 6:55 am

maffiu wrote:
Sat Jun 15, 2019 8:38 pm
Ktoś może testował tester pH tego typu ?

https://s.click.aliexpress.com/e/2lqFq5Ba7
Coś link nie działa

Ja się przymierzam do zakupu. Też przeglądałem Ali za tym oraz YT jak to oprogramoeac i kalibrować.
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
maffiu
Posts: 487
Joined: Wed Nov 30, 2016 9:30 pm
Location: Kraków/Skawina

Sun Jun 16, 2019 9:42 am

Patrzyłem na coś takiego co się nazywa ph4502c jak by to działało to do basenu albo akwarium jak znalazł

Ewentualnie coś takiego u nas maja

https://botland.com.pl/pl/czujniki-pogo ... ogowy.html
User avatar
QLQ
Posts: 802
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Sun Jun 16, 2019 10:16 am

Kupiłem. Jak przyjdzie dam znać. Zrobię prezentację wartość i na czujniki odległości lub temp.

A dziś abstrahując od tematu wpadł mi genialny pomysł. Tym fajniej że obsługą czujnika jest w Supla Cloud.
Zaraz założę nowy temat
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
lesny8
Posts: 776
Joined: Mon Dec 11, 2017 9:43 pm

Sun Jun 16, 2019 3:01 pm

Tak się zastanawiam gdzie jeszcze można by taki czujnik wykorzystać? Akwarium nie mam, basenu też :? może kiedyś...
A może monitowanie wody dostarczanej z wodociągów, czy jest sens?
User avatar
maffiu
Posts: 487
Joined: Wed Nov 30, 2016 9:30 pm
Location: Kraków/Skawina

Sun Jun 16, 2019 6:48 pm

Omiotłem wzrokiem podwórko oprócz basenu i akwarium gdzie są to ważne elementy do studni mógł bym go wrzucić jeszcze ewentualnie bardziej jako ciekawostkę do stacji pogodowej jakiś zbiorniczek na deszczówkę i niech się mierzy opad ;p
User avatar
maffiu
Posts: 487
Joined: Wed Nov 30, 2016 9:30 pm
Location: Kraków/Skawina

Sun Jun 16, 2019 6:51 pm

QLQ wrote:
Sun Jun 16, 2019 10:16 am
Kupiłem. Jak przyjdzie dam znać. Zrobię prezentację wartość i na czujniki odległości lub temp.

A dziś abstrahując od tematu wpadł mi genialny pomysł. Tym fajniej że obsługą czujnika jest w Supla Cloud.
Zaraz założę nowy temat
Który zamówiłeś
User avatar
QLQ
Posts: 802
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Sun Jun 16, 2019 7:11 pm

maffiu wrote:
Sun Jun 16, 2019 6:51 pm
QLQ wrote:
Sun Jun 16, 2019 10:16 am
Kupiłem. Jak przyjdzie dam znać. Zrobię prezentację wartość i na czujniki odległości lub temp.

A dziś abstrahując od tematu wpadł mi genialny pomysł. Tym fajniej że obsługą czujnika jest w Supla Cloud.
Zaraz założę nowy temat
Który zamówiłeś
Ten: https://pl.aliexpress.com/item/PH-ciecz ... 5c0fH3Yj8d

Kurde nie chce gadać z wemos ale z arduino nano owszem. Troche dziwne :? Muszę jeszcze kupić jakieś wzorce pH. Może ogarnę z wemos lub innym esp . Byłoby fajnie.

EDIT: już trochę ogarnąłem WeMos kod poniżej , dodam jeszcze kalibrację ale muszę kupić wzorce np 4 i 7pH.

Wstępny kod który działa z Wemos (na razie bez Cloud ale dorobię):

Code: Select all

int ph_pin = A0; //This is the pin number connected to Po

void setup() {
  Serial.begin(9600);
}

void loop() {
  int measure = analogRead(ph_pin);
  Serial.print("Measure: ");
  Serial.print(measure);

  double voltage = 5 / 1024.0 * measure; //classic digital to voltage conversion
  Serial.print("\tVoltage: ");
  Serial.print(voltage, 3);

  // PH_step = (voltage@PH7 - voltage@PH4) / (PH7 - PH4)
  // PH_probe = PH7 - ((voltage@PH7 - voltage@probe) / PH_step)
  float Po = 14 + ((2.5 - voltage) / 0.18);
  Serial.print("\tPH: ");
  Serial.print(Po, 3);

  Serial.println("");
  delay(2000);
}
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
QLQ
Posts: 802
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Thu Jul 04, 2019 5:16 pm

maffiu wrote:
Sun Jun 16, 2019 6:51 pm
QLQ wrote:
Sun Jun 16, 2019 10:16 am
Kupiłem. Jak przyjdzie dam znać. Zrobię prezentację wartość i na czujniki odległości lub temp.

A dziś abstrahując od tematu wpadł mi genialny pomysł. Tym fajniej że obsługą czujnika jest w Supla Cloud.
Zaraz założę nowy temat
Który zamówiłeś
Przyszło , zrobione ,oprogramowane, czekam tylko na roztwory buforowe bo wymaga kalibracji, którą jak zrobię to opiszę. Chodzi o wartości w kodzie

Porszę kod pod Supla:

Code: Select all

                                              /**
   Supla.org NodeMCU WiFi minimal example
   Author: Programistyk - Kamil Kaminski <kamil@programistyk.pl>

   This example shows how to configure SuplaDevice for building for NodeMCU within Arduino IDE
*/

#include <BH1750FVI.h>
#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
// We define our own ethernet layer
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define OLED_RESET 0
Adafruit_SSD1306 display(OLED_RESET); // GPIO5 - SCL , GPIO4 -SDA
#include "HX711.h"
#define calibration_factor -24160.0 //This value is obtained using the SparkFun_HX711_Calibration sketch
#define DOUT  12
#define CLK  14
//float Ph;
HX711 scale;
String light;
int ph_pin = A0; //This is the pin number connected to Po

#define SEALEVELPRESSURE_HPA (1023.0)

Adafruit_BME280 bme; // I2C

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes);
#define LOGO32_GLCD_HEIGHT 32
#define LOGO32_GLCD_WIDTH  32
static const unsigned char PROGMEM temp_glcd_bmp[] =
{ // temp_home
  0x00, 0x03, 0xc0, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x50, 0x00, 
  0x00, 0x08, 0x50, 0x00, 0x00, 0x08, 0x50, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x50, 0x00, 
  0x00, 0x08, 0xd0, 0x00, 0x00, 0x0b, 0x10, 0x00, 0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 
  0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 
  0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 
  0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 0x00, 0x0b, 0xd0, 0x00, 0x00, 0x17, 0xe8, 0x00, 
  0x00, 0x2f, 0xf4, 0x00, 0x00, 0x2f, 0x94, 0x00, 0x00, 0x2f, 0xb4, 0x00, 0x00, 0x2f, 0xf4, 0x00, 
  0x00, 0x07, 0xe0, 0x00, 0x00, 0x13, 0xc8, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xc0, 0x00
};

static const unsigned char PROGMEM waga_glcd_bmp[] =
{
 0x00,0x00,0x80,0x00, // ········▌·······
  0x00,0x01,0xC0,0x00, // ·······▐█·······
  0x00,0x01,0xC0,0x00, // ·······▐█·······
  0x00,0x01,0xC0,0x00, // ·······▐█·······
  0x3F,0xFF,0xFF,0xFC, // ·██████████████·
  0x3F,0xFF,0xFF,0xFE, // ·██████████████▌
  0x3F,0xFF,0xFF,0xFE, // ·██████████████▌
  0x07,0x81,0xC0,0xF0, // ··▐█▌··▐█···██··
  0x07,0x81,0x80,0xF0, // ··▐█▌··▐▌···██··
  0x0F,0xC1,0xC1,0xF8, // ··███··▐█··▐██▌·
  0x1C,0xC1,0xC1,0x98, // ·▐█·█··▐█··▐▌▐▌·
  0x18,0xE1,0xC3,0x8C, // ·▐▌·█▌·▐█··█▌·█·
  0x38,0x61,0xC3,0x0E, // ·█▌·▐▌·▐█··█··█▌
  0x30,0x71,0xC7,0x06, // ·█··▐█·▐█·▐█··▐▌
  0xFF,0xF9,0xCF,0xFF, // ██████▌▐█·██████
  0xFF,0xF9,0xCF,0xFF, // ██████▌▐█·██████
  0xFF,0xF9,0xCF,0xFF, // ██████▌▐█·██████
  0x7F,0xF9,0xCF,0xFF, // ▐█████▌▐█·██████
  0x3F,0xF1,0xC7,0xFE, // ·█████·▐█·▐████▌
  0x3F,0xE1,0xC3,0xFE, // ·████▌·▐█··████▌
  0x0F,0xC1,0xC1,0xF8, // ··███··▐█··▐██▌·
  0x00,0x01,0xC0,0x00, // ·······▐█·······
  0x00,0x01,0xC0,0x00, // ·······▐█·······
  0x00,0x01,0xC0,0x00, // ·······▐█·······
  0x00,0x01,0xC0,0x00, // ·······▐█·······
  0x00,0x01,0x80,0x00, // ·······▐▌·······
  0x00,0x1F,0xFC,0x00, // ·····▐█████·····
  0x00,0x3F,0xFE,0x00, // ·····██████▌····
  0x00,0x3F,0xFE,0x00, // ·····██████▌····
  0x00,0x3F,0xFE,0x00, // ·····██████▌····
  0x00,0x1F,0xFC,0x00, // ·····▐█████·····
  0x00,0x00,0x00,0x00  // ················
};


static const unsigned char PROGMEM logo32_glcd_bmp[] =
{
  // 'logo SUPLA'
  0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00,
  0x0e, 0x0e, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00,
  0x1c, 0x03, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x0e, 0x0f, 0x80, 0x00, 0x07, 0xfc, 0xe0, 0x00,
  0x03, 0xf8, 0x30, 0x00, 0x00, 0xf0, 0x0d, 0xe0, 0x00, 0x10, 0x07, 0x30, 0x00, 0x18, 0x02, 0x10,
  0x00, 0x18, 0x06, 0x18, 0x00, 0x08, 0x02, 0x10, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x0c, 0x07, 0xc0,
  0x00, 0x04, 0x0c, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00,
  0x00, 0x03, 0xc0, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x00, 0x0c, 0x20, 0x00,
  0x00, 0x04, 0x40, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char PROGMEM ASL_glcd_bmp[] =
{
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 
  0x00, 0x00, 0x60, 0x00, 0x00, 0x08, 0x21, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x62, 0x00, 
  0x00, 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0x0c, 0x00, 0x00, 0x61, 0x84, 0x00, 0x00, 0xc0, 0xc4, 0xe0, 
  0x01, 0xc0, 0xf4, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 
  0x06, 0x10, 0xcd, 0x00, 0x03, 0x10, 0x99, 0x00, 0x01, 0x84, 0x30, 0x00, 0x00, 0x25, 0x00, 0x00, 
  0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
  };

char* Message[] = {"This is string 1",
                   "Already initialized",
                   "Cb not assigned",
                   "Invalid GUID",
                   "Unknown server address",
                   "Unknow location ID",
                   "Initialized",
                   "Channel limit exceeded",
                   "Rozlaczony",
                   "Rejstracja w toku",
                   "Iterate fail",
                   "Protocol version error",
                   "Bad credentials",
                   "Temporarily unawaliable",
                   "Location conflict",
                   "Channel conflict",
                   "Polaczony i gotowy",
                   "Device is diasbled",
                   "Location is disabled",
                   "Device limit execeeded"
                  };



#if (SSD1306_LCDHEIGHT != 64)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// ***** logowanie WiFi ********************************************************************************
WiFiClient client;

// Setup Supla connection
const char* ssid     = "xx";
const char* password = "xmnxx";
char str[10];
char StatCommStr[25];
int StatCommInt;
byte Icon;
byte FiveSek;




double get_distance(int channelNumber, double Ph) {

  int measure = analogRead(ph_pin);
  Serial.print("Measure: ");
  Serial.print(measure);

  double voltage = 5 / 1024.0 * measure; //classic digital to voltage conversion
  Serial.print("\tVoltage: ");
  Serial.print(voltage, 3);

  // PH_step = (voltage@PH7 - voltage@PH4) / (PH7 - PH4)
  // PH_probe = PH7 - ((voltage@PH7 - voltage@probe) / PH_step)
  float Po = 14 + ((2.5 - voltage) / 0.18);
  Serial.print("\tPH: ");
  Serial.print(Po, 3);
  Ph = Po; 
  Serial.println("");
  delay(2000);
  return Ph;
    }



void timer0_ISR (void) {
  FiveSek++;
  if (FiveSek==2) {
    FiveSek=0;
    Icon++;
    if (Icon==3) Icon=1;
  }
  timer0_write(ESP.getCycleCount() + 80000000L); // 80MHz == 1sec 
}

//// ******* Funkcja główna *********************************************************************************
void setup() {
  
  Serial.begin(9600); 
 // int measure = analogRead(ph_pin);

  
  scale.begin(DOUT, CLK);
  scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
  scale.tare(); //Assuming there is no weight on the scale at start up, 
  
   
  noInterrupts();
  timer0_isr_init();
  timer0_attachInterrupt(timer0_ISR);
  timer0_write(ESP.getCycleCount() + 80000000L); // 80MHz == 1sec
  interrupts();
 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
 
  Icon = 0;

  // Clear the buffer.
  display.clearDisplay();

  // text display tests
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setRotation(2);
  display.setCursor(30, 25);
  display.print("SUPLA");
  drawbitmap(logo32_glcd_bmp, LOGO32_GLCD_HEIGHT, LOGO32_GLCD_WIDTH);
  display.display();





  // Replace the falowing GUID
char GUID[SUPLA_GUID_SIZE] = {0xE6,0x0A,0x50,0x0C,0xEA,0x1C,0x48,0x59,0xED,0xFB,0xAD,0xCC,0x58,0x42,0x08,0xF9};

  //  GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  /*
     Having your device already registered at cloud.supla.org,
     you want to change CHANNEL sequence or remove any of them,
     then you must also remove the device itself from cloud.supla.org.
     Otherwise you will get "Channel conflict!" error.
  */
    
          // CHANNEL0 
            
            SuplaDevice.addDistanceSensor();

 
  SuplaDevice.setName("Sonda_pH");
  SuplaDevice.setStatusFuncImpl(&status_func);

  SuplaDevice.begin(GUID,              // Global Unique Identifier
                    mac,               // Ethernet MAC address
                    "svr5.supla.org",  // SUPLA server address
                    111,                 // Location ID
                    "5117");               // Location Password

}


// ***********************************************************************************************************
void loop() {
  SuplaDevice.iterate();
  DisplayTemp();
 
}

// ****   Obsługa OLED    ****************************************************************************************************



void DisplayTemp() {

   double waga = abs(scale.get_units());
double Light_Intensity = LightSensor.GetLightIntensity();
int rain=0.01;
 
  display.clearDisplay();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setRotation(2);
  display.setCursor(45, 25);  
 
  switch (Icon) {
      case 1:
        display.setTextSize(4);
        display.setCursor(30, 20 );  
       // display.print(waga, 0);
        display.print("kg" );
      //  drawbitmap(waga_glcd_bmp, LOGO32_GLCD_HEIGHT, LOGO32_GLCD_WIDTH);
        
        break;
        
        case 2:
        display.setTextSize(4);
        display.setCursor(30, 20 );  
     //   display.print(waga, 0);
        display.print("kg" );
      
      //  drawbitmap(waga_glcd_bmp, LOGO32_GLCD_HEIGHT, LOGO32_GLCD_WIDTH);
        
        break;
     
    

//---------------------        
  };
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 55);
  display.print(Message[StatCommInt - 1]);
  display.display();
  display.display();

}; //DisplayTemp

void drawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  uint8_t icons[NUMFLAKES][3];

  display.drawBitmap(0, 0, bitmap, w, h, WHITE);
} //drawbitmap


// Supla.org ethernet layer
int supla_arduino_tcp_read(void *buf, int count) {
  _supla_int_t size = client.available();

  if ( size > 0 ) {
    if ( size > count ) size = count;
    return client.read((uint8_t *)buf, size);
  };

  return -1;
};

int supla_arduino_tcp_write(void *buf, int count) {
  return client.write((const uint8_t *)buf, count);
};

bool supla_arduino_svr_connect(const char *server, int port) {
  return client.connect(server, 2015);
}

bool supla_arduino_svr_connected(void) {
  return client.connected();
}

void supla_arduino_svr_disconnect(void) {
  client.stop();
}

void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

  // Serial.println("WiFi init");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
        Serial.print(".");
  }

 // Serial.print("\nlocalIP: ");
 // Serial.println(WiFi.localIP());
  //Serial.print("subnetMask: ");
 // Serial.println(WiFi.subnetMask());
  //Serial.print("gatewayIP: ");
  //Serial.println(WiFi.gatewayIP());
}

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
  SuplaDeviceCallbacks cb;

  cb.tcp_read = &supla_arduino_tcp_read;
  cb.tcp_write = &supla_arduino_tcp_write;
  cb.eth_setup = &supla_arduino_eth_setup;
  cb.svr_connected = &supla_arduino_svr_connected;
  cb.svr_connect = &supla_arduino_svr_connect;
  cb.svr_disconnect = &supla_arduino_svr_disconnect;
  cb.get_temperature_and_humidity = NULL;
  cb.get_pressure = NULL; 
  cb.get_temperature = NULL;
  cb.get_rgbw_value = NULL;
  cb.set_rgbw_value = NULL;
  cb.get_distance= get_distance;

  return cb;
}



void status_func(int status, const char *msg) {
  Serial.print("Status : ");
  Serial.print(status);
  StatCommInt = status;
  Serial.print(" - ");
  Serial.println(Message[StatCommInt - 1]);
  display.fillRect(0, 55, 128, 65, BLACK);

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setRotation(2);
  display.setCursor(0, 55);
  display.print(Message[StatCommInt - 1]);
  display.display();

}
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
Lector
Posts: 468
Joined: Fri Nov 17, 2017 2:26 pm
Location: Poznań
Contact:

Thu Jul 04, 2019 8:36 pm

Jestem ciekaw jak z dokładnością będzie - z rozkalibrowywaniem się.
Też szukam jakieś czujnika PH do wody w basenie, tym bardziej ze bardzo skacze mi do góry.
Przerabiałem dwa elektroniczne, które za każdym razem pokazywały inaczej. A pomiar tabletkami pochłania je momentalnie.
Więc czekam za rezultatami :)
Post Reply