Windows IoT 和 DS3231 RTC 时钟

2024-01-10

对于我的项目,我需要当前时间和日期。不幸的是,当 RP2 关闭时,它就会失去一切。接下来的事情是,我将没有互联网连接来使用 NTP。 为此,我需要实现 DS3231 RTC 模块。 所有设备的通信都通过 I2C 运行(Raspberry Arduino DS3231)。 目前,我的 Arduino 与模块通信并将日期和时间存储在字符数组中。 RP2 与 Arduino 通信以获取日期/时间。这实际上效果很好。但我想直接与模块通信以节省Arduino上的资源(它只是一个Nano)。 因此,我想知道是否有人有该模块和 Windows IoT 的经验。

您可以在下面找到我当前的解决方案:

Arduino:

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
#define MyAddress 0x40   /* Define the i2c address */

char time_char[10];
char date_char[10];

byte ReceivedData;

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

void setup()
{
  Wire.begin(MyAddress);
  Serial.begin(9600);
  Wire.onReceive(I2CReceived);
  Wire.onRequest(I2CRequest);
}

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h

  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void displayTime()
{
  String hour_str, minute_str, second_str, day_str, month_str, year_str, hour_str_orig, minute_str_orig, second_str_orig, time_str, date_str;
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,&year);

  if (hour<10)
  {
    hour_str_orig = (hour);
    hour_str = ("0" + hour_str_orig);
  }
  else
  {
    hour_str = (hour);
  }

  if (minute<10)
  {
   minute_str_orig = (minute);
   minute_str = ("0" + minute_str_orig);
  }
  else
  {
   minute_str = (minute);
  }

  if (second<10)
  {
   second_str_orig = (second);
   second_str = ("0" + second_str_orig);
  }
  else
  {
   second_str = (second);
  }

  day_str = (dayOfMonth);
  month_str = (month);
  year_str = (year);

  time_str = (hour_str + ":" + minute_str + ":" + second_str);
  date_str = (day_str + "." + month_str + "." + "20" +year_str);


  time_str.toCharArray(time_char, 10); 
  date_str.toCharArray(date_char, 10);       

}
void loop()
{
  displayTime(); // send the real-time clock data to IoT
  delay(1000); // every second
}

void I2CReceived(int NumberOfBytes)
{
    /* WinIoT have sent data byte; read it */
    ReceivedData = Wire.read();
}

void I2CRequest()
  {

if (ReceivedData == 50)    
{
    Wire.write(time_char);
}

if (ReceivedData == 51) 
{
    Wire.write(date_char);
}

}

IoT:

public async void TestFunction()
{
    for (int i = 0; i < 50; i++)
    {
        for (byte DataToBeSend = 50; DataToBeSend < 52; DataToBeSend++)
        {
            if (DataToBeSend == 50)
            {
                byte ReceivedData;

                ReceivedData = await Time.WriteRead_OneByte(DataToBeSend);

                await Task.Delay(10);
            }

            if (DataToBeSend == 51)
            {
                byte ReceivedData;

                ReceivedData = await Time.WriteRead_OneByte(DataToBeSend);

                await Task.Delay(10);
            }
        }

        await Task.Delay(1000);

    }
}

Class:

  public class Time
    {
        private static string AQS;
        private static DeviceInformationCollection DIS;
        public static float result_fl;


        public static async System.Threading.Tasks.Task<byte> WriteRead_OneByte(byte ByteToBeSend)
        {
            byte[] ReceivedData = new byte[10];


            /* Gateway's I2C SLAVE address */
            int SlaveAddress = 64;              // 0x40

            try
            {
                // Initialize I2C
                var Settings = new I2cConnectionSettings(SlaveAddress);
                Settings.BusSpeed = I2cBusSpeed.StandardMode;

                if (AQS == null || DIS == null)
                {
                    AQS = I2cDevice.GetDeviceSelector("I2C1");
                    DIS = await DeviceInformation.FindAllAsync(AQS);
                }


                using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id, Settings))
                {
                    /* Send byte to Arduino Nano */
                    Device.Write(new byte[] { ByteToBeSend });

                    /* Read byte from Arduino Nano */
                    Device.Read(ReceivedData);

                    /* Rewrite Array to avoid empty space in source array */
                    var i = ReceivedData.Length - 1;
                    while (ReceivedData[i] == 255)
                    {
                        --i;
                    }

                    var date_time_arr = new byte[i + 1];
                    Array.Copy(ReceivedData, date_time_arr, i + 1);

                    /* Show date or time */
                    string result = System.Text.Encoding.UTF8.GetString(date_time_arr);
                    Debug.WriteLine(result);
                }
            }
            catch (Exception)
            {

            }
            return ReceivedData[0];
        }
    }

如果您需要更多信息,请告诉我。 谢谢!


抱歉回复迟了! 到目前为止我的解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Devices.I2c;
using System.Diagnostics;

namespace _015_Test15_I2C_Clock_RTC3231
{
    public class I2C_Time
    {
        private static string AQS;
        private static DeviceInformationCollection DIS;

        public static async Task GetTimeFromDS3231()
        {

            /* DS3231 I2C SLAVE address */
            int SlaveAddress = 0x68;

            try
            {
                // Initialize I2C
                var Settings = new I2cConnectionSettings(SlaveAddress);
                Settings.BusSpeed = I2cBusSpeed.StandardMode;

                if (AQS == null || DIS == null)
                {
                    AQS = I2cDevice.GetDeviceSelector("I2C1");
                    DIS = await DeviceInformation.FindAllAsync(AQS);
                }


                using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id, Settings))
                {
                    byte[] writeBuf = { 0x00 };
                    Device.Write(writeBuf);
                    byte[] readBuf = new byte[7];
                    Device.Read(readBuf);
                    byte second = bcdToDec((byte)(readBuf[0] & 0x7f));
                    byte minute = bcdToDec(readBuf[1]);
                    byte hour = bcdToDec((byte)(readBuf[2] & 0x3f));
                    byte dayOfWeek = bcdToDec(readBuf[3]);
                    byte dayOfMonth = bcdToDec(readBuf[4]);
                    byte month = bcdToDec(readBuf[5]);
                    byte year = bcdToDec(readBuf[6]);
                }
            }
            catch (Exception)
            {
                Debug.WriteLine("Error in I2C_Time Class");
            }
        }

        private static byte bcdToDec(byte val)
            {
                return (byte)(((int)val / 16 * 10) + ((int)val % 16));
            }
        }
    }

设置时钟:

 using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id, Settings))
            {
                byte write_seconds = decToBcd(set_Time_now_seconds);
                byte write_minutes = decToBcd(set_Time_now_minutes);
                byte write_hours = decToBcd(set_Time_now_hours);
                byte write_dayofweek = decToBcd(set_Date_now_dayofweek);
                byte write_day = decToBcd(set_Date_now_day);
                byte write_month = decToBcd(set_Date_now_month);
                byte write_year = decToBcd(set_Date_now_year);

                byte[] write_time = {0x00, write_seconds, write_minutes, write_hours, write_dayofweek, write_day, write_month, write_year };

                Device.Write(write_time);

            }
        // Convert normal decimal numbers to binary coded decimal
    private static byte decToBcd(byte val)
    {
        return (byte)(((int)val / 10 * 16) + ((int)val % 10));
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows IoT 和 DS3231 RTC 时钟 的相关文章

  • VSCode 上的 PlatformIO 未编译:collect2.exe:错误:ld 返回 1 退出状态

    我最近不得不擦拭我的计算机 在一切准备就绪并运行之后 是时候打开我之前正在处理的一些 ESP32 程序了 发现 VSCode 上的 Platform IO 将不再编译 运行编译器后 我收到以下错误 Compiling pio build e
  • android BluetoothChat 使用来自另一个类的发送接收方法

    您好 我使用 BluetoothChat 示例来与 arduino 进行通信 到目前为止 一切正常 现在我想访问 sendMessage 方法 以便能够不从主类发送数据 而是从我创建的另一个类发送数据 这是BluetoothChat jav
  • 在 Raspberry Pi 上使用 Python smbus - 与语法混淆

    我正在尝试在 Raspberry Pi 上使用 python smbus 使用 I2C 与 MMA7660 加速计芯片进行通信 在下面的代码中 我正在读取芯片的寄存器 0x 00 0x01 0x02 和 0x03 并且我得到的值完全相同 查
  • Mac OS 10.9 不显示 Arduino 的 USB 调制解调器

    我正在尝试选择 dev tty usbmodem on my Arduino Lenardo设备 操作系统是Mac OSX 10 9 问题是它没有显示 我什至尝试安装FTDI http www ftdichip com Drivers VC
  • Arduino I2S 正弦波

    我正在开发一个项目 我想通过组合不同的正弦波来生成 简单 声音 我使用的是 arduino mkrZero 因为它内置了 I2S 接口 并且似乎有足够的处理能力来满足我的需求 I have wired my system exactly l
  • Android 和 Arduino 都通过蓝牙接收奇怪的值

    我正在 Android 端使用 BluetoothChat 代码使用聊天框向 Arduino UNO 发送开 关信号 我发送 110 119 或下面定义的其他情况 但是当我显示接收到的值时 它显示奇怪的Arduino 串行监视器中的值 即
  • 如何将 ASCII char 转换为其 ASCII int 值?

    我想将 char 转换为它的ASCII http en wikipedia org wiki ASCIIint 值 我可以用所有可能的值填充一个数组并与其进行比较 但这对我来说似乎不正确 我想要类似的东西 char mychar k pub
  • 经典蓝牙 (2.1) 设备可实现的最小数据包延迟是多少?

    我正在使用 RN42 http www microchip com wwwproducts en RN42 http www microchip com wwwproducts en RN42 蓝牙模块以 115200 波特率 UART S
  • Python自动选择串口(适用于Arduino)

    目前 Python 程序必须知道设备 Arduino 位于哪个端口 然后 Python 才能与设备进行通信 Problem 每当设备拔出并重新插入时 其 COM 端口都会发生变化 因此必须再次向 Python 提供正确的串行端口 以便它找到
  • 静态 uint8_t 数组的输入过程和类型

    我目前正在尝试将 Arduino IDE 中的整数变量转换为静态 uint8 t 数组的值 我在用 include
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • 在Python中快速绘制数据

    我正在尝试使用 arduino 绘制来自 mpu6050 imu 的数据 MPU6050 发送数据的速度比绘图快 Arduino 代码从串口提供 6 个数据 即偏航 俯仰 滚动 轴 ay 和 az 我需要快速情节的建议 Python代码 i
  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • AVRDUDE Android Arduino ioctl 错误

    我之前的问题 Android 无法使用 AVRDUDE 与 Arduino 通信 https stackoverflow com questions 15596376 android cannot talk to arduino using
  • 使用 SPIFFS 加载文件时出现问题 (ERR_CONTENT_LENGTH_MISMATCH)

    好吧 这两天我一直在研究这个问题 但我仍然觉得我一无所获 我最近开始使用SPIFFS 文件系统 for Arduino开发于呼扎 ESP8266像FSBrowser ino例如 虽然它在分离代码方面非常出色 但随着我的代码不断增长 它在稳定
  • 如何使用GSM模块SIM800和Arduino Uno发送短信?

    我正在尝试通过 SIM800 GSM 模块从 Arduino 发送短信 消息到达给定号码 但格式不正确 它显示 消息格式不支持 我在这里添加了我的代码 非常感谢您的快速回复 include
  • SIM900 GSM/GPRS 未获得正确的 AT+CREG?回答

    我使用的是带有 IComsat SIM900 GSM GPRS 扩展板的 Arduino UNO 使用以下教程 Arduino 实时 GPS 追踪器 http www samaria me uk 2011 12 arduino live g
  • Arduino C++ 析构函数?

    我知道在Arduino中你不能使用delete 那么什么时候调用 C 类中定义的析构函数呢 同样 如果我想创建一个指向数组的指针 我必须使用malloc and free 当对象被销毁时 析构函数被调用 对于自动 堆栈上 变量 它在离开其作
  • Arduino C++ 代码:可以使用虚函数和异常吗?

    跟进这条评论 https stackoverflow com questions 452139 writing firmware assembly or high level 452401从问题中编写固件 汇编还是高级 https stac
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需

随机推荐

  • 在 Visual C# 中从 RichTextBox 中删除 RichText 格式

    我正在用 C 开发一个高级富文本编辑器 但偶然发现了一个我似乎无法理解的问题 我一直试图让用户将他们的文档保存为文本文件 纯文本 通过使用以下内容 我的 RichTextBox Save 文件 文件路径 PlainText 但问题是 当他们
  • 1.8 与 1.9 中的 BigDecimal

    升级到 ruby 1 9 时 在比较预期值与实际值时 我的测试失败了BigDecimal这是 Float 除法的结果 expected 0 495E0 9 18 got 0 4950000000 0000005E0 18 27 谷歌搜索 b
  • CSS 第一次在 3D 变换时不渲染背面

    我有一个卡片翻转风格的动画 可以将文本区域翻转 180 度 我遇到的唯一问题是 第一次执行翻转时 在经过 90 度后 元素消失 然后在完成 180 度旋转后出现后面的元素 这是带有代码的示例 http jsfiddle net elninj
  • 阻止用户删除 BigQuery 表

    我们正在尝试创建一个非常基本的角色 允许用户查询 BigQuery 表 但不能删除它们 我们正在试验的自定义角色现在具有以下权限 bigquery jobs create bigquery jobs get bigquery jobs li
  • 如何清除 Selectize.js 下拉列表中的选定值?

    我有一个selectize js https selectize github io selectize js 下拉菜单 我必须清除所选值 我已经尝试过这个 如建议的另一个问题 https stackoverflow com questio
  • Nexus 10 Camera.release 挂起 30 秒

    我们是一群正在开发 Android 实时视频处理应用程序的开发人员 最近 一位客户报告我们的应用程序出现冻结 这种情况仅发生在 Nexus 10 设备上 我们自己购买了设备并进行了测试 设备预装了 Android 4 2 我们的应用程序没有
  • 如何将带有 alpha 的 PNG 转换为 RGBA4444 以便在 SpriteKit SKTexture 中使用?

    我有一堆透明 PNG 我想在SKSpriteNode动画与SKTextures 我需要调整内存使用情况SKTextures 通过降低纹理质量RGBA8888 to RGBA4444 我将如何初始化SKTexture with RGBA444
  • 带有子类的构造函数中的 Object.freeze

    如果我希望我的类不可变 我知道我可以使用Object freeze 现在 如果我希望我的对象在构造后不可变 我会放Object freeze this 作为最后一行进入我的构造函数 但现在 如果我想子类化它 我无法添加更多参数 因为我无法调
  • 在 React.js 中检索复选框的值

    我想在选中复选框时检索它的值 我正在使用这个 http react component github io checkbox http react component github io checkbox 我的代码看起来像这样 div ch
  • 如何设置密码最小长度

    我目前正在制作 html 表单 如何将密码的最小长度设置为8 以便拒绝用户输入小于8的密码 如何做到这一点 这是代码 div div
  • 使用 mvcmailer 发送多封电子邮件

    我想使用MVC邮件程序 https github com smsohan MvcMailer wiki MvcMailer Step by Step Guide使用 asp net mvc 3 和 razor 发送电子邮件 还提到过Scot
  • 如何在 postgresql 中将 DELETE 的返回插入到 INSERT 中?

    我正在尝试从一个表中删除一行并将其与一些附加数据插入到另一个表中 我知道这可以通过两个单独的命令来完成 一个用于删除 另一个用于插入新表 然而我试图将它们结合起来但它不起作用 这是我到目前为止的查询 insert into b one tw
  • Django - 基于函数的视图 (FBV) 不允许使用方法

    我得到了405 METHOD NOT ALLOWED当我尝试通过 AJAX 调用提交 POST 请求时的响应 POST events profile update HTTP 1 1 405 0 我试图用最基本的视图来设置它 def prof
  • 重写抽象类以返回硬编码方法值

    我想从这里覆盖 CoreUtils 抽象类https docs spring io spring framework docs current javadoc api org springframework web cors reactiv
  • Laravel 路由重定向而不关闭路由缓存

    我的电脑上有这个代码routes php执行重定向的文件 虽然问题是每当我跑步时php artisan route cache命令 它给了我一个错误Unable to prepare route article params for ser
  • 用于网络请求的 AsyncTask 与 ThreadPoolExecutor

    我正在开发一个项目 我需要点击 Web 服务下载 JSON 数据并将其表示在列表中 所有列表项都有缩略图 URL 可以下载并显示在列表项中 我已经使用 ThreadPoolExecutor 和 AsyncTask 完成了整个调用部分 但从设
  • 在 Spring Batch 中访问步骤范围之外的 Bean

    是否可以访问步骤范围之外定义的 bean 例如 如果我定义策略 strategyA 并将其传递到作业参数中 我希望 Value 解析为strategyA bean 这可能吗 我目前正在通过从 applicationContext 手动获取
  • NPM Start 未启动本地服务器

    我正在尝试使用 webpack 制作一个 React 应用程序 当我尝试运行 npm start 时 它应该加载http localhost 3333但它说无法访问网站 这是我的 webpack 配置 module exports entr
  • 滑动视图控制器,但不使用 UISwipeGestureRecognizer

    这是我的问题 我有 5 个视图控制器 我可以使用 UISwipeGestureRecognizer 类和 xcode 的故事板通过滑动在它们之间切换 所以这可行 但是 我不喜欢幻灯片效果 我喜欢以某种方式进行制作 这样您就可以通过拖动将视图
  • Windows IoT 和 DS3231 RTC 时钟

    对于我的项目 我需要当前时间和日期 不幸的是 当 RP2 关闭时 它就会失去一切 接下来的事情是 我将没有互联网连接来使用 NTP 为此 我需要实现 DS3231 RTC 模块 所有设备的通信都通过 I2C 运行 Raspberry Ard